ZGlmZiAtLWdpdCBhL3plYnJhL0NoYW5nZUxvZyBiL3plYnJhL0NoYW5nZUxvZwppbmRleCAwNDYxOWFlLi5kYTMyMTBlIDEwMDY0NAotLS0gYS96ZWJyYS9DaGFuZ2VMb2cKKysrIGIvemVicmEvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNyBAQAorMjAwNC0wNi0xMiBSb2JlcnQgT2xzc29uIDxSb2JlcnQuT2xzc29uIGF0IGRhdGEuc2x1LnNlPgorCisgICAgICAgICogQWRkZWQgSVJEUCBzdXBwb3J0LgorCiAyMDA0LTA1LTE4IEhhc3NvIFRlcHBlciA8aGFzc29AZXN0cGFrLmVlPgogCiAJKiBydGFkdi5jOiBSZW1vdmVkICJbbm9dIGlwdjYgbmQgc2VuZC1yYSIgY29tbWFuZC4gUmVwbGFjZWQgImlwdjYgbmQKZGlmZiAtLWdpdCBhL3plYnJhL01ha2VmaWxlLmFtIGIvemVicmEvTWFrZWZpbGUuYW0KaW5kZXggNjFmZGFlYS4uNmI0OTRlNyAxMDA2NDQKLS0tIGEvemVicmEvTWFrZWZpbGUuYW0KKysrIGIvemVicmEvTWFrZWZpbGUuYW0KQEAgLTIzLDExICsyMywxMiBAQAogCiB6ZWJyYV9TT1VSQ0VTID0gXAogCXpzZXJ2LmMgbWFpbi5jIGludGVyZmFjZS5jIGNvbm5lY3RlZC5jIHplYnJhX3JpYi5jIFwKLQlyZWRpc3RyaWJ1dGUuYyBkZWJ1Zy5jIHJ0YWR2LmMgemVicmFfc25tcC5jIHplYnJhX3Z0eS5jCisJcmVkaXN0cmlidXRlLmMgZGVidWcuYyBydGFkdi5jIHplYnJhX3NubXAuYyB6ZWJyYV92dHkuYyBcCisJaXJkcF9tYWluLmMgaXJkcF9pbnRlcmZhY2UuYyBpcmRwX3BhY2tldC5jCiAKIG5vaW5zdF9IRUFERVJTID0gXAogCWNvbm5lY3RlZC5oIGlvY3RsLmggcmliLmggcnQuaCB6c2Vydi5oIHJlZGlzdHJpYnV0ZS5oIGRlYnVnLmggcnRhZHYuaCBcCi0JaW50ZXJmYWNlLmggaXBmb3J3YXJkLmgKKwlpbnRlcmZhY2UuaCBpcGZvcndhcmQuaCBpcmRwLmgKIAogemVicmFfTERBREQgPSAuLi9saWIvbGliemVicmEuYSAkKG90aGVyb2JqKSAkKExJQkNBUCkgJChMSUJfSVBWNikKIApkaWZmIC0tZ2l0IGEvemVicmEvaW50ZXJmYWNlLmMgYi96ZWJyYS9pbnRlcmZhY2UuYwppbmRleCA3NDhiZjAwLi4zYTdhNTkxIDEwMDY0NAotLS0gYS96ZWJyYS9pbnRlcmZhY2UuYworKysgYi96ZWJyYS9pbnRlcmZhY2UuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiAjaW5jbHVkZSAiemVicmEvcmVkaXN0cmlidXRlLmgiCiAjaW5jbHVkZSAiemVicmEvZGVidWcuaCIKKyNpbmNsdWRlICJ6ZWJyYS9pcmRwLmgiCiAMCiAvKiBBbGxvY2F0ZSBhIG5ldyBpbnRlcm5hbCBpbnRlcmZhY2UgaW5kZXggCiAgKiBUaGlzIHdvcmtzIGRvbmUgZnJvbSB0aGUgdG9wIHNvIHRoYXQgJWQgbWFjcm9zCkBAIC0xNDE5LDYgKzE0MjAsMTAgQEAKICAgICAgIHJ0YWR2X2NvbmZpZ193cml0ZSAodnR5LCBpZnApOwogI2VuZGlmIC8qIFJUQURWICovCiAKKyNpZmRlZiBIQVZFX0lSRFAKKyAgICAgIGlyZHBfY29uZmlnX3dyaXRlICh2dHksIGlmcCk7CisjZW5kaWYgLyogSVJEUCAqLworCiAgICAgICB2dHlfb3V0ICh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CiAgICAgfQogICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3plYnJhL2ludGVyZmFjZS5oIGIvemVicmEvaW50ZXJmYWNlLmgKaW5kZXggM2FiNjI0Zi4uYzFmOWY3MSAxMDA2NDQKLS0tIGEvemVicmEvaW50ZXJmYWNlLmgKKysrIGIvemVicmEvaW50ZXJmYWNlLmgKQEAgLTE5LDYgKzE5LDEwIEBACiAgKiAwMjExMS0xMzA3LCBVU0EuICAKICAqLwogCisjaWZkZWYgSEFWRV9JUkRQCisjaW5jbHVkZSAiemVicmEvaXJkcC5oIgorI2VuZGlmCisKIC8qIEZvciBpbnRlcmZhY2UgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb24uICovCiAjZGVmaW5lIElGX1pFQlJBX01VTFRJQ0FTVF9VTlNQRUMgMAogI2RlZmluZSBJRl9aRUJSQV9NVUxUSUNBU1RfT04gICAgIDEKQEAgLTE1Myw2ICsxNTcsMTEgQEAKICNpZmRlZiBSVEFEVgogICBzdHJ1Y3QgcnRhZHZjb25mIHJ0YWR2OwogI2VuZGlmIC8qIFJUQURWICovCisKKyNpZmRlZiBIQVZFX0lSRFAKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlIGlyZHA7CisjZW5kaWYKKwogfTsKIAogdm9pZCBpZl9kZWxldGVfdXBkYXRlIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApOwpkaWZmIC0tZ2l0IGEvemVicmEvaXJkcC5oIGIvemVicmEvaXJkcC5oCmluZGV4IDBmYWQ1ODEuLjJiZjE3ZjAgMTAwNjQ0Ci0tLSBhL3plYnJhL2lyZHAuaAorKysgYi96ZWJyYS9pcmRwLmgKQEAgLTE5LDYgKzE5LDE5IEBACiAgKiAwMjExMS0xMzA3LCBVU0EuICAKICAqLwogCisvKiAKKyAqIFRoaXMgZmlsZSBpcyBtb2RpZmllZCBhbmQgY29tcGxldGVkIGZvciB0aGUgWmVicmEgSVJEUCBpbXBsZW1lbnRhdGlvbgorICogYnkgUm9iZXJ0IE9sc3NvbiwgU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICovCisKKyNpZm5kZWYgX0lSRFBfSAorI2RlZmluZSBfSVJEUF9ICisKKyNpbmNsdWRlICJsaWIvdnR5LmgiCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKwogLyogSUNNUCBNZXNzYWdlcyAqLwogI2lmbmRlZiBJQ01QX1JPVVRFUkFEVkVSVAogI2RlZmluZSBJQ01QX1JPVVRFUkFEVkVSVCA5CkBAIC0zMCwxNyArNDMsMzYgQEAKIAogLyogTXVsdGljYXN0IGdyb3VwcyAqLwogI2lmbmRlZiBJTkFERFJfQUxMSE9TVFNfR1JPVVAKLSNkZWZpbmUgSU5BRERSX0FMTEhPU1RTX0dST1VQIDB4ZTAwMDAwMDEgICAgLyogMjI0LjAuMC4xICovCisjZGVmaW5lIElOQUREUl9BTExIT1NUU19HUk9VUCAweGUwMDAwMDAxVSAgICAvKiAyMjQuMC4wLjEgKi8KICNlbmRpZiAvKiBJTkFERFJfQUxMSE9TVFNfR1JPVVAgKi8KIAogI2lmbmRlZiBJTkFERFJfQUxMUlRSU19HUk9VUAotI2RlZmluZSBJTkFERFJfQUxMUlRSU19HUk9VUCAgMHhlMDAwMDAwMiAgICAvKiAyMjQuMC4wLjIgKi8KKyNkZWZpbmUgSU5BRERSX0FMTFJUUlNfR1JPVVAgIDB4ZTAwMDAwMDJVICAgIC8qIDIyNC4wLjAuMiAqLwogI2VuZGlmIC8qIElOQUREUl9BTExSVFJTX0dST1VQICovCiAKLS8qIENvbW1lbnRzIGNvbWVzIGZyb20gUkZDMTI1NiBJQ01QIFJvdXRlciBEaXNjb3ZlcnkgTWVzc2FnZXMuICovCi1zdHJ1Y3QgaXJkcF9yb3V0ZXJfaW50ZXJmYWNlIAotewotICAvKiBUaGUgSVAgZGVzdGluYXRpb24gYWRkcmVzcyB0byBiZSB1c2VkIGZvciBtdWx0aWNhc3QgUm91dGVyCisvKiBEZWZhdWx0IGlyZHAgcGFja2V0IGludGVydmFsICovCisjZGVmaW5lIElSRFBfREVGQVVMVF9JTlRFUlZBTCAzMDAgCisKKy8qIFJvdXRlciBjb25zdGFudHMgZnJvbSBSRkMxMjU2ICovCisjZGVmaW5lIE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTCAxNgorI2RlZmluZSBNQVhfSU5JVElBTF9BRFZFUlRJU0VNRU5UUyAgIDMKKyNkZWZpbmUgTUFYX1JFU1BPTlNFX0RFTEFZICAgICAgICAgICAyCisKKyNkZWZpbmUgSVJEUF9NQVhBRFZFUlRJTlRFUlZBTCA2MDAKKyNkZWZpbmUgSVJEUF9NSU5BRFZFUlRJTlRFUlZBTCA0NTAgLyogMC43NSo2MDAgKi8KKyNkZWZpbmUgSVJEUF9MSUZFVElNRSAgICAgICAgIDEzNTAgLyogMyo0NTAgKi8KKyNkZWZpbmUgSVJEUF9QUkVGRVJFTkNFIDAKKworI2RlZmluZSBJQ01QX01JTkxFTiA4CisKKyNkZWZpbmUgSVJEUF9MQVNUX0FEVkVSVF9NRVNTQUdFUyAyIC8qIFRoZSBsYXN0IGFkdmVydHMgd2l0aCBIb2xkdGltZSAwICovCisKKyNkZWZpbmUgSVJEUF9SWF9CVUYgMTUwMAorCisvKiAKKyAgICAgQ29tbWVudHMgY29tZXMgZnJvbSBSRkMxMjU2IElDTVAgUm91dGVyIERpc2NvdmVyeSBNZXNzYWdlcy4gCisKKyAgICAgVGhlIElQIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gYmUgdXNlZCBmb3IgbXVsdGljYXN0IFJvdXRlcgogICAgICBBZHZlcnRpc2VtZW50cyBzZW50IGZyb20gdGhlIGludGVyZmFjZS4gIFRoZSBvbmx5IHBlcm1pc3NpYmxlCiAgICAgIHZhbHVlcyBhcmUgdGhlIGFsbC1zeXN0ZW1zIG11bHRpY2FzdCBhZGRyZXNzLCAyMjQuMC4wLjEsIG9yIHRoZQogICAgICBsaW1pdGVkLWJyb2FkY2FzdCBhZGRyZXNzLCAyNTUuMjU1LjI1NS4yNTUuICAoVGhlIGFsbC1zeXN0ZW1zCkBAIC00OCwxMDEgKzgwLDc0IEBACiAgICAgIGFsbCBsaXN0ZW5pbmcgaG9zdHMgc3VwcG9ydCBJUCBtdWx0aWNhc3QuKQogCiAgICAgIERlZmF1bHQ6IDIyNC4wLjAuMSBpZiB0aGUgcm91dGVyIHN1cHBvcnRzIElQIG11bHRpY2FzdCBvbiB0aGUKLSAgICAgaW50ZXJmYWNlLCBlbHNlIDI1NS4yNTUuMjU1LjI1NSAqLworICAgICBpbnRlcmZhY2UsIGVsc2UgMjU1LjI1NS4yNTUuMjU1IAogCi0gIHN0cnVjdCBpbl9hZGRyIEFkdmVydGlzZW1lbnRBZGRyZXNzOwotCi0gIC8qIFRoZSBtYXhpbXVtIHRpbWUgYWxsb3dlZCBiZXR3ZWVuIHNlbmRpbmcgbXVsdGljYXN0IFJvdXRlcgorICAgICBUaGUgbWF4aW11bSB0aW1lIGFsbG93ZWQgYmV0d2VlbiBzZW5kaW5nIG11bHRpY2FzdCBSb3V0ZXIKICAgICAgQWR2ZXJ0aXNlbWVudHMgZnJvbSB0aGUgaW50ZXJmYWNlLCBpbiBzZWNvbmRzLiAgTXVzdCBiZSBubyBsZXNzCiAgICAgIHRoYW4gNCBzZWNvbmRzIGFuZCBubyBncmVhdGVyIHRoYW4gMTgwMCBzZWNvbmRzLgogCi0gICAgIERlZmF1bHQ6IDYwMCBzZWNvbmRzICovCisgICAgIERlZmF1bHQ6IDYwMCBzZWNvbmRzIAogCi0gIHVuc2lnbmVkIGxvbmcgTWF4QWR2ZXJ0aXNlbWVudEludGVydmFsOwotCi0gIC8qIFRoZSBtaW5pbXVtIHRpbWUgYWxsb3dlZCBiZXR3ZWVuIHNlbmRpbmcgdW5zb2xpY2l0ZWQgbXVsdGljYXN0CisgICAgIFRoZSBtaW5pbXVtIHRpbWUgYWxsb3dlZCBiZXR3ZWVuIHNlbmRpbmcgdW5zb2xpY2l0ZWQgbXVsdGljYXN0CiAgICAgIFJvdXRlciBBZHZlcnRpc2VtZW50cyBmcm9tIHRoZSBpbnRlcmZhY2UsIGluIHNlY29uZHMuICBNdXN0IGJlIG5vCiAgICAgIGxlc3MgdGhhbiAzIHNlY29uZHMgYW5kIG5vIGdyZWF0ZXIgdGhhbiBNYXhBZHZlcnRpc2VtZW50SW50ZXJ2YWwuCiAKLSAgICAgRGVmYXVsdDogMC43NSAqIE1heEFkdmVydGlzZW1lbnRJbnRlcnZhbCAqLworICAgICBEZWZhdWx0OiAwLjc1ICogTWF4QWR2ZXJ0aXNlbWVudEludGVydmFsIAogCi0gIHVuc2lnbmVkIGxvbmcgTWluQWR2ZXJ0aXNlbWVudEludGVydmFsOwotCi0KLSAgLyogVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBpbiB0aGUgTGlmZXRpbWUgZmllbGQgb2YgUm91dGVyCisgICAgIFRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgaW4gdGhlIExpZmV0aW1lIGZpZWxkIG9mIFJvdXRlcgogICAgICBBZHZlcnRpc2VtZW50cyBzZW50IGZyb20gdGhlIGludGVyZmFjZSwgaW4gc2Vjb25kcy4gIE11c3QgYmUgbm8KICAgICAgbGVzcyB0aGFuIE1heEFkdmVydGlzZW1lbnRJbnRlcnZhbCBhbmQgbm8gZ3JlYXRlciB0aGFuIDkwMDAKICAgICAgc2Vjb25kcy4KIAotICAgICBEZWZhdWx0OiAzICogTWF4QWR2ZXJ0aXNlbWVudEludGVydmFsICovCisgICAgIERlZmF1bHQ6IDMgKiBNYXhBZHZlcnRpc2VtZW50SW50ZXJ2YWwgCiAKLSAgdW5zaWduZWQgbG9uZyBBZHZlcnRpc2VtZW50TGlmZXRpbWU7Ci0KLSAgLyogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGFkZHJlc3MgaXMgdG8gYmUgYWR2ZXJ0aXNlZC4KLQotICAgICBEZWZhdWx0OiBUUlVFICovCi0KLSAgaW50IEFkdmVydGlzZTsKLQotCi0gIC8qIFRoZSBwcmVmZXJhYmlsaXR5IG9mIHRoZSBhZGRyZXNzIGFzIGEgZGVmYXVsdCByb3V0ZXIgYWRkcmVzcywKKyAgICAgVGhlIHByZWZlcmFiaWxpdHkgb2YgdGhlIGFkZHJlc3MgYXMgYSBkZWZhdWx0IHJvdXRlciBhZGRyZXNzLAogICAgICByZWxhdGl2ZSB0byBvdGhlciByb3V0ZXIgYWRkcmVzc2VzIG9uIHRoZSBzYW1lIHN1Ym5ldC4gIEEgMzItYml0LAogICAgICBzaWduZWQsIHR3b3MtY29tcGxlbWVudCBpbnRlZ2VyLCB3aXRoIGhpZ2hlciB2YWx1ZXMgbWVhbmluZyBtb3JlCiAgICAgIHByZWZlcmFibGUuICBUaGUgbWluaW11bSB2YWx1ZSAoaGV4IDgwMDAwMDAwKSBpcyB1c2VkIHRvIGluZGljYXRlCiAgICAgIHRoYXQgdGhlIGFkZHJlc3MsIGV2ZW4gdGhvdWdoIGl0IG1heSBiZSBhZHZlcnRpc2VkLCBpcyBub3QgdG8gYmUKICAgICAgdXNlZCBieSBuZWlnaGJvcmluZyBob3N0cyBhcyBhIGRlZmF1bHQgcm91dGVyIGFkZHJlc3MuCiAKLSAgICAgRGVmYXVsdDogMCAqLworICAgICBEZWZhdWx0OiAwIAorKi8KIAotICB1bnNpZ25lZCBsb25nIFByZWZlcmVuY2VMZXZlbDsKLX07Ci0KLXN0cnVjdCBpcmRwX2hvc3RfaW50ZXJmYWNlIAorc3RydWN0IGlyZHBfaW50ZXJmYWNlIAogewotICAvKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgaG9zdCBpcyB0byBwZXJmb3JtIElDTVAgcm91dGVyCi0gICAgIGRpc2NvdmVyeSBvbiB0aGUgaW50ZXJmYWNlLiAqLwotICBpbnQgUGVyZm9ybVJvdWVyRGlzY292ZXJ5OwotICAKLSAgLyogVGhlIElQIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyBSb3V0ZXIKLSAgICAgU29saWNpdGF0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuICBUaGUgb25seSBwZXJtaXNzaWJsZSB2YWx1ZXMKLSAgICAgYXJlIHRoZSBhbGwtcm91dGVycyBtdWx0aWNhc3QgYWRkcmVzcywgMjI0LjAuMC4yLCBvciB0aGUKLSAgICAgbGltaXRlZC1icm9hZGNhc3QgYWRkcmVzcywgMjU1LjI1NS4yNTUuMjU1LiAgKFRoZSBhbGwtcm91dGVycwotICAgICBhZGRyZXNzIGlzIHByZWZlcnJlZCB3aGVyZXZlciBwb3NzaWJsZSwgaS5lLiwgb24gYW55IGxpbmsgd2hlcmUKLSAgICAgYWxsIGFkdmVydGlzaW5nIHJvdXRlcnMgc3VwcG9ydCBJUCBtdWx0aWNhc3QuKSAgKi8KLSAgdW5zaWduZWQgbG9uZyBTb2xpY2l0YXRpb25BZGRyZXNzOworICB1bnNpZ25lZCBsb25nIE1heEFkdmVydEludGVydmFsOworICB1bnNpZ25lZCBsb25nIE1pbkFkdmVydEludGVydmFsOworICB1bnNpZ25lZCBsb25nIFByZWZlcmVuY2U7CisKKyAgdV9pbnQzMl90IGZsYWdzOworCisjZGVmaW5lIElGX0FDVElWRSAgICAgICAgICAgICAgICgxPDwwKSAvKiBJQ01QIEFjdGl2ZSAqLworI2RlZmluZSBJRl9CUk9BRENBU1QgICAgICAgICAgICAoMTw8MSkgLyogMjU1LjI1NS4yNTUuMjU1ICovCisjZGVmaW5lIElGX1NPTElDSVQgICAgICAgICAgICAgICgxPDwyKSAvKiBTb2xpY2l0IGFjdGl2ZSAqLworI2RlZmluZSBJRl9ERUJVR19NRVNTQUdFUyAgICAgICAoMTw8MykgCisjZGVmaW5lIElGX0RFQlVHX1BBQ0tFVCAgICAgICAgICgxPDw0KSAKKyNkZWZpbmUgSUZfREVCVUdfTUlTQyAgICAgICAgICAgKDE8PDUpIAorI2RlZmluZSBJRl9TSFVURE9XTiAgICAgICAgICAgICAoMTw8NikgCisKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgdGhyZWFkICp0X2FkdmVydGlzZTsKKyAgdW5zaWduZWQgbG9uZyBpcmRwX3NlbnQ7CisgIHVfaW50MTZfdCBMaWZldGltZTsKKworIGxpc3QgQWR2UHJlZkxpc3Q7CisKIH07CiAKLQotLyogUm91dGUgcHJlZmVyZW5jZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBpcmRwIAorc3RydWN0IEFkdiAKIHsKLSAgc3RydWN0IGluX2FkZHIgcHJlZml4OwotICBsb25nIHByZWY7CQkvKiBwcmVmZXJlbmNlIGxldmVsICovCi0gIGxvbmcgdGltZXI7CQkJLyogbGlmZXRpbWUgdGltZXIgKi8KLQotICBzdHJ1Y3QgaXJkcCAqbmV4dDsJCS8qIGRvdWJseSBsaW5rZWQgbGlzdCAqLwotICBzdHJ1Y3QgaXJkcCAqcHJldjsJCS8qIGRvdWJseSBsaW5rZWQgbGlzdCAqLworICBzdHJ1Y3QgaW5fYWRkciBpcDsKKyAgaW50IHByZWY7CiB9OwogCi0vKiBEZWZhdWx0IGlyZHAgcGFja2V0IGludGVydmFsICovCi0jZGVmaW5lIElSRFBfREVGQVVMVF9JTlRFUlZBTCAzMDAKK3ZvaWQgaXJkcF9pbml0KCk7Cit2b2lkIGlyZHBfZmluaXNoKCk7Cit2b2lkIGlyZHBfY29uZmlnX3dyaXRlIChzdHJ1Y3QgdnR5ICosIHN0cnVjdCBpbnRlcmZhY2UgKik7CisjZW5kaWYgLyogX0lSRFBfSCAqLwogCi0vKiBSb3V0ZXIgY29uc3RhbnRzIGZyb20gUkZDMTI1NiAqLwotI2RlZmluZSBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwgMTYKLSNkZWZpbmUgTUFYX0lOSVRJQUxfQURWRVJUSVNFTUVOVFMgICAzCi0jZGVmaW5lIE1BWF9SRVNQT05TRV9ERUxBWSAgICAgICAgICAgMgogCi0vKiBIb3N0IGNvbnN0YW50cyBmcm9tIFJGQzEyNTYgKi8KLSNkZWZpbmUgTUFYX1NPTElDSVRBVElPTl9ERUxBWSAgICAgICAxCi0jZGVmaW5lIFNPTElDSVRBVElPTl9JTlRFUlZBTCAgICAgICAgMwotI2RlZmluZSBNQVhfU09MSUNJVEFUSU9OUyAgICAgICAgICAgIDMKIAotZW51bQotewotICBJUkRQX05PTkUsCi0gIElSRFBfUk9VVEVSLAotICBJUkRQX0hPU1QsCi19OwogCi0vKiBkZWZhdWx0IGlzIGhvc3QgbW9kZSAqLwotZXh0ZXJuIGludCBpcmRwX21vZGU7CisKZGlmZiAtLWdpdCBhL3plYnJhL2lyZHBfaW50ZXJmYWNlLmMgYi96ZWJyYS9pcmRwX2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWFkMGUKLS0tIC9kZXYvbnVsbAorKysgYi96ZWJyYS9pcmRwX2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsNzg0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgUm9iZXJ0IE9sc3Nvbi4KKyAqIFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4gIAorICovCisKKy8qIAorICogVGhpcyB3b3JrIGluY2x1ZGVzIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIGNvcHl3cml0ZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAgS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKi8KKworLyogCisgKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqIGZvciByZXZpZXdpbmcgYW5kIHRlc3RzLgorICovCisKKworI2luY2x1ZGUgPHplYnJhLmg+CisKKyNpZmRlZiBIQVZFX0lSRFAgCisKKyNpbmNsdWRlICJpZi5oIgorI2luY2x1ZGUgInZ0eS5oIgorI2luY2x1ZGUgInNvY2t1bmlvbi5oIgorI2luY2x1ZGUgInByZWZpeC5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJzdHJlYW0uaCIKKyNpbmNsdWRlICJpb2N0bC5oIgorI2luY2x1ZGUgImNvbm5lY3RlZC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInpjbGllbnQuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ6ZWJyYS9ydGFkdi5oIgorI2luY2x1ZGUgInplYnJhL3JpYi5oIgorI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCisjaW5jbHVkZSAiemVicmEvcmVkaXN0cmlidXRlLmgiCisjaW5jbHVkZSAiemVicmEvaXJkcC5oIgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgorI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAic29ja3VuaW9uLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKworLyogTWFzdGVyIG9mIHRocmVhZHMuICovCitleHRlcm4gc3RydWN0IHplYnJhX3QgemVicmFkOworCitpbnQgaW5fY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5ieXRlcyk7CitleHRlcm4gaW50IGlyZHBfc29jazsKK2ludCBpcmRwX3NlbmRfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKnRfYWR2ZXJ0KTsKK2NoYXIgKmluZXRfMmEodV9pbnQzMl90IGEsIGNoYXIgKmIpOwordm9pZCBpcmRwX2FkdmVydF9vZmYoc3RydWN0IGludGVyZmFjZSAqaWZwKTsKKworCitjaGFyIGIxWzE2XSwgYjJbMTZdLCBiM1sxNl0sIGI0WzE2XTsgIC8qIEZvciBpbmV0XzJhICovCisKK3N0cnVjdCBwcmVmaXggKmlyZHBfZ2V0X3ByZWZpeChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIGxpc3Rub2RlIG5vZGU7CisgIHN0cnVjdCBjb25uZWN0ZWQgKmlmYzsKKyAgCisgIGlmKGlmcC0+Y29ubmVjdGVkKSAKKyAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKyAgICAgIGlmYyA9IGdldGRhdGEgKG5vZGUpOworICAgICAgcmV0dXJuIGlmYy0+YWRkcmVzczsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBKb2luIHRvIHRoZSBhZGQvbGVhdmUgbXVsdGljYXN0IGdyb3VwLiAqLworaW50IGlmX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAorCSAgaW50IHNvY2ssIAorCSAgdV9pbnQzMl90IGdyb3VwLCAKKwkgIGludCBhZGRfbGVhdmUpCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcF9tcmVxIG07CisgIHN0cnVjdCBwcmVmaXggKnA7CisgIGludCByZXQ7CisKKyAgemkgPSBpZnAtPmluZm87CisKKyAgYnplcm8gKCZtLCBzaXplb2YgKG0pKTsKKyAgbS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IGh0b25sIChncm91cCk7CisgIHAgPSBpcmRwX2dldF9wcmVmaXgoaWZwKTsKKworICBpZighcCkgeworICAgICAgICB6bG9nX3dhcm4gKCJJUkRQOiBjYW4ndCBnZXQgYWRkcmVzcyBmb3IgJXMiLCBpZnAtPm5hbWUpOworCXJldHVybiAxOworICB9CisKKyAgbS5pbXJfaW50ZXJmYWNlID0gcC0+dS5wcmVmaXg0OworCisgIHJldCA9IHNldHNvY2tvcHQgKHNvY2ssIElQUFJPVE9fSVAsIGFkZF9sZWF2ZSwKKwkJICAgIChjaGFyICopICZtLCBzaXplb2YgKHN0cnVjdCBpcF9tcmVxKSk7CisgIGlmIChyZXQgPCAwKQorICAgIHpsb2dfd2FybiAoIklSRFA6ICVzIGNhbid0IHNldHNvY2tvcHQgJXM6ICVzIiwKKwkgICAgICAgYWRkX2xlYXZlID09IElQX0FERF9NRU1CRVJTSElQPyAiam9pbiBncm91cCI6ImxlYXZlIGdyb3VwIiwgCisgICAgICAgICAgICAgICBpbmV0XzJhKGdyb3VwLCBiMSksCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKworICByZXR1cm4gcmV0OworfQorCitpbnQgaWZfYWRkX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9IGlmcC0+aW5mbzsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOworICBpbnQgcmV0OworCisgIHJldCA9IGlmX2dyb3VwIChpZnAsIGlyZHBfc29jaywgSU5BRERSX0FMTFJUUlNfR1JPVVAsIElQX0FERF9NRU1CRVJTSElQKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDICkKKyAgICB6bG9nX3dhcm4oIklSRFA6IEFkZGluZyBncm91cCAlcyBmb3IgJXNcbiIsIAorCSAgICAgIGluZXRfMmEoaHRvbmwoSU5BRERSX0FMTFJUUlNfR1JPVVApLCBiMSksCisJICAgICAgaWZwLT5uYW1lKTsKKyAgcmV0dXJuIDA7Cit9CitpbnQgaWZfZHJvcF9ncm91cCAoc3RydWN0IGludGVyZmFjZSAqaWZwKQoreworICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKKyAgaW50IHJldDsKKworICByZXQgPSBpZl9ncm91cCAoaWZwLCBpcmRwX3NvY2ssIElOQUREUl9BTExSVFJTX0dST1VQLCBJUF9EUk9QX01FTUJFUlNISVApOworICBpZiAocmV0IDwgMCkKKyAgICByZXR1cm4gcmV0OworCisgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykKKyAgICB6bG9nX3dhcm4oIklSRFA6IExlYXZpbmcgZ3JvdXAgJXMgZm9yICVzXG4iLCAKKwkgICAgICBpbmV0XzJhKGh0b25sKElOQUREUl9BTExSVFJTX0dST1VQKSwgYjEpLAorCSAgICAgIGlmcC0+bmFtZSk7CisgIHJldHVybiAwOworfQorCitzdHJ1Y3QgaW50ZXJmYWNlICpnZXRfaWZsaXN0X2lmcChpbnQgaWR4KQoreworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlmbGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworICAgICAgaWZwID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZihpZnAtPmlmaW5kZXggPT0gaWR4KSByZXR1cm4gaWZwOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2lmX3NldF9kZWZhdWx0cyhzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPk1heEFkdmVydEludGVydmFsID0gSVJEUF9NQVhBRFZFUlRJTlRFUlZBTDsKKyAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPSBJUkRQX01JTkFEVkVSVElOVEVSVkFMOworICBpcmRwLT5QcmVmZXJlbmNlID0gSVJEUF9QUkVGRVJFTkNFOworICBpcmRwLT5MaWZldGltZSA9IElSRFBfTElGRVRJTUU7Cit9CisKKworc3RydWN0IEFkdiAqQWR2X25ldyAoKQoreworICBzdHJ1Y3QgQWR2ICpuZXc7CisgIG5ldyA9IFhNQUxMT0MgKE1UWVBFX1RNUCwgc2l6ZW9mIChzdHJ1Y3QgQWR2KSk7CisgIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKHN0cnVjdCBBZHYpKTsKKyAgcmV0dXJuIG5ldzsKK30KKwordm9pZCBBZHZfZnJlZSAoc3RydWN0IEFkdiAqYWR2KQoreworICBYRlJFRSAoTVRZUEVfVE1QLCBhZHYpOworfQorCit2b2lkIGlyZHBfaWZfc3RhcnQoc3RydWN0IGludGVyZmFjZSAqaWZwLCBpbnQgbXVsdGljYXN0LCBpbnQgc2V0X2RlZmF1bHRzKQoreworICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKKyAgbGlzdG5vZGUgbm9kZTsKKyAgdV9pbnQzMl90IHRpbWVyLCBzZWVkOworCisgIGlmIChpcmRwLT5mbGFncyAmIElGX0FDVElWRSApIHsKKyAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBhbHJlYWR5IGFjdGl2ZSAlc1xuIiwgaWZwLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgaXJkcC0+ZmxhZ3MgfD0gSUZfQUNUSVZFOworCisgIGlmKCFtdWx0aWNhc3QpIAorICAgIGlyZHAtPmZsYWdzIHw9IElGX0JST0FEQ0FTVDsKKworICBpZl9hZGRfdXBkYXRlKGlmcCk7CisKKyAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSB7CisgICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgZG93biAlc1xuIiwgaWZwLT5uYW1lKTsKKyAgfQorCisgIC8qIFNoYWxsIHdlIGNhbmNlbCBpZl9zdGFydCBpZiBpZl9hZGRfZ3JvdXAgZmFpbHM/ICovCisKKyAgaWYoIG11bHRpY2FzdCkgeworICAgIGlmX2FkZF9ncm91cChpZnApOworICAgIAorICAgIGlmICghIChpZnAtPmZsYWdzICYgKElGRl9NVUxUSUNBU1R8SUZGX0FMTE1VTFRJKSkpIHsKKyAgICAgIHpsb2dfd2FybigiSVJEUDogSW50ZXJmYWNlIG5vdCBtdWx0aWNhc3QgZW5hYmxlZCAlc1xuIiwgaWZwLT5uYW1lKTsKKyAgICB9CisgIH0KKworICBpZihzZXRfZGVmYXVsdHMpIAorICAgIGlmX3NldF9kZWZhdWx0cyhpZnApOworCisgIGlyZHAtPmlyZHBfc2VudCA9IDA7CisKKyAgLyogVGhlIHNwZWMgc3VnZ2VzdHMgdGhpcyBmb3IgcmFuZG9tbmVzcyAqLworCisgIHNlZWQgPSAwOworICBpZiggaWZwLT5jb25uZWN0ZWQpIAorCSAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlmcC0+Y29ubmVjdGVkKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSAKKwkgIHsKKwkJICBzdHJ1Y3QgY29ubmVjdGVkICppZmMgPSBnZXRkYXRhIChub2RlKTsKKwkJICBzZWVkID0gaWZjLT5hZGRyZXNzLT51LnByZWZpeDQuc19hZGRyOworCSAgfQorICAKKyAgc3JhbmRvbShzZWVkKTsKKyAgdGltZXIgPSAgKHJhbmRvbSAoKSAlIElSRFBfREVGQVVMVF9JTlRFUlZBTCkgKyAxOyAKKworICBpcmRwLT5BZHZQcmVmTGlzdCA9IGxpc3RfbmV3KCk7CisgIGlyZHAtPkFkdlByZWZMaXN0LT5kZWwgPSAgKHZvaWQgKikgQWR2X2ZyZWU7IC8qIERlc3RydWN0b3IgKi8KKworCisgIC8qIEFuZCB0aGlzIGZvciBzdGFydHVwLiBTcGVlZCBsaW1pdCBmcm9tIDE5OTEgOi0pLiBCdXQgaXQncyBPSyovCisKKyAgaWYoaXJkcC0+aXJkcF9zZW50IDwgTUFYX0lOSVRJQUxfQURWRVJUSVNFTUVOVFMgJiYKKyAgICAgdGltZXIgPiBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwgKSAKKwkgIHRpbWVyPSBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUw7CisKKyAgCisgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykKKyAgICB6bG9nX3dhcm4oIklSRFA6IEluaXQgdGltZXIgZm9yICVzIHNldCB0byAldVxuIiwgCisJICAgICAgaWZwLT5uYW1lLCAKKwkgICAgICB0aW1lcik7CisKKyAgaXJkcC0+dF9hZHZlcnRpc2UgPSB0aHJlYWRfYWRkX3RpbWVyKHplYnJhZC5tYXN0ZXIsIAorCQkJCSAgICAgICBpcmRwX3NlbmRfdGhyZWFkLCAKKwkJCQkgICAgICAgaWZwLCAKKwkJCQkgICAgICAgdGltZXIpOworfQorCit2b2lkIGlyZHBfaWZfc3RvcChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICAKKyAgaWYgKGlyZHAgPT0gTlVMTCkgeworICAgIHpsb2dfd2FybiAoIkludGVyZmFjZSAlcyBzdHJ1Y3R1cmUgaXMgTlVMTCIsIGlmcC0+bmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCEgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFICkpIHsKKyAgICB6bG9nX3dhcm4oIkludGVyZmFjZSBpcyBub3QgYWN0aXZlICVzXG4iLCBpZnAtPm5hbWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSkgCisgICAgaWZfZHJvcF9ncm91cChpZnApOworCisgIGlyZHBfYWR2ZXJ0X29mZihpZnApOworCisgIGxpc3RfZGVsZXRlKGlyZHAtPkFkdlByZWZMaXN0KTsKKyAgaXJkcC0+QWR2UHJlZkxpc3Q9TlVMTDsKKworICBpcmRwLT5mbGFncyA9IDA7Cit9CisKKwordm9pZCBpcmRwX2lmX3NodXRkb3duKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAgPSAmemktPmlyZHA7CisKKyAgaWYgKGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04gKSB7CisgICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgYWxyZWFkeSBzaHV0ZG93biAlc1xuIiwgaWZwLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpcmRwLT5mbGFncyB8PSBJRl9TSFVURE9XTjsKKyAgaXJkcC0+ZmxhZ3MgJj0gfklGX0FDVElWRTsKKworICBpZighIChpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCkpIAorICAgIGlmX2Ryb3BfZ3JvdXAoaWZwKTsKKyAgCisgIC8qIFRlbGwgdGhlIGhvc3RzIHdlIGFyZSBvdXQgb2Ygc2VydmljZSAqLworICBpcmRwX2FkdmVydF9vZmYoaWZwKTsKK30KKwordm9pZCBpcmRwX2lmX25vX3NodXRkb3duKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAgPSAmemktPmlyZHA7CisKKyAgaWYgKCEgKGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04gKSkgeworICAgIHpsb2dfd2FybigiSVJEUDogSW50ZXJmYWNlIGlzIG5vdCBzaHV0ZG93biAlc1xuIiwgaWZwLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpcmRwLT5mbGFncyAmPSB+SUZfU0hVVERPV047CisKKyAgaXJkcF9pZl9zdGFydChpZnAsIGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUPyBGQUxTRSA6IFRSVUUsIEZBTFNFKTsgCisKK30KKworCisvKiBXcml0ZSBjb25maWd1cmF0aW9uIHRvIHVzZXIgKi8KKwordm9pZCBpcmRwX2NvbmZpZ193cml0ZSAoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICBzdHJ1Y3QgQWR2ICphZHY7CisgIGxpc3Rub2RlIG5vZGU7CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9BQ1RJVkUgfHwgaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTikgeworCisgICAgaWYoIGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04pIAorICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgc2h1dGRvd24gJXMiLCAgVlRZX05FV0xJTkUpOworCisgICAgaWYoIGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSAKKyAgICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIGJyb2FkY2FzdCVzIiwgIFZUWV9ORVdMSU5FKTsKKyAgICBlbHNlIAorICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgbXVsdGljYXN0JXMiLCAgVlRZX05FV0xJTkUpOworCisgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgcHJlZmVyZW5jZSAlbGQlcyIsICAKKwkgICAgIGlyZHAtPlByZWZlcmVuY2UsIFZUWV9ORVdMSU5FKTsKKworICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcmRwLT5BZHZQcmVmTGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworCSAgICBhZHYgPSBnZXRkYXRhIChub2RlKTsKKwkgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgYWRkcmVzcyAlcyBwcmVmZXJlbmNlICVkJXMiLAorCQkgICAgIGluZXRfMmEoYWR2LT5pcC5zX2FkZHIsIGIxKSwKKwkJICAgICBhZHYtPnByZWYsCisJCSAgICAgVlRZX05FV0xJTkUpOworCisgICAgfQorCisgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgaG9sZHRpbWUgJWQlcyIsICAKKwkgICAgIGlyZHAtPkxpZmV0aW1lLCBWVFlfTkVXTElORSk7CisKKyAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBtaW5hZHZlcnRpbnRlcnZhbCAlbGQlcyIsICAKKwkgICAgIGlyZHAtPk1pbkFkdmVydEludGVydmFsLCBWVFlfTkVXTElORSk7CisKKyAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBtYXhhZHZlcnRpbnRlcnZhbCAlbGQlcyIsICAKKwkgICAgIGlyZHAtPk1heEFkdmVydEludGVydmFsLCBWVFlfTkVXTElORSk7CisKKyAgfQorfQorCisKK0RFRlVOIChpcF9pcmRwX211bHRpY2FzdCwKKyAgICAgICBpcF9pcmRwX211bHRpY2FzdF9jbWQsCisgICAgICAgImlwIGlyZHAgbXVsdGljYXN0IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlIHVzaW5nIG11bHRpY2FzdFxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIGlyZHBfaWZfc3RhcnQoaWZwLCBUUlVFLCBUUlVFKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9icm9hZGNhc3QsCisgICAgICAgaXBfaXJkcF9icm9hZGNhc3RfY21kLAorICAgICAgICJpcCBpcmRwIGJyb2FkY2FzdCIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZSB1c2luZyBicm9hZGNhc3RcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICBpcmRwX2lmX3N0YXJ0KGlmcCwgRkFMU0UsIFRSVUUpOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX25vLAorICAgICAgIGlwX2lyZHBfY21kX25vLAorICAgICAgICJubyBpcCBpcmRwIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiRGlzYWJsZSBJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2VcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICBpcmRwX2lmX3N0b3AoaWZwKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9zaHV0ZG93biwKKyAgICAgICBpcF9pcmRwX3NodXRkb3duX2NtZCwKKyAgICAgICAiaXAgaXJkcCBzaHV0ZG93biIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBzaHV0ZG93biBvbiB0aGlzIGludGVyZmFjZVxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIGlyZHBfaWZfc2h1dGRvd24oaWZwKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9ub19zaHV0ZG93biwKKyAgICAgICBpcF9pcmRwX25vX3NodXRkb3duX2NtZCwKKyAgICAgICAibm8gaXAgaXJkcCBzaHV0ZG93biIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBubyBzaHV0ZG93biBvbiB0aGlzIGludGVyZmFjZVxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIGlyZHBfaWZfbm9fc2h1dGRvd24oaWZwKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9ob2xkdGltZSwKKyAgICAgICBpcF9pcmRwX2hvbGR0aW1lX2NtZCwKKyAgICAgICAiaXAgaXJkcCBob2xkdGltZSA8MC05MDAwPiIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJTZXQgaG9sZHRpbWUgdmFsdWVcbiIKKyAgICAgICAiSG9sZHRpbWUgdmFsdWUgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyAxODAwIHNlY29uZHNcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPkxpZmV0aW1lID0gYXRvaShhcmd2WzBdKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9taW5hZHZlcnRpbnRlcnZhbCwKKyAgICAgICBpcF9pcmRwX21pbmFkdmVydGludGVydmFsX2NtZCwKKyAgICAgICAiaXAgaXJkcCBtaW5hZHZlcnRpbnRlcnZhbCA8My0xODAwPiIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJTZXQgbWluaW11bSB0aW1lIGJldHdlZW4gYWR2ZXJ0aXNlbWVudFxuIgorICAgICAgICJNaW5pbXVtIGFkdmVydGlzZW1lbnQgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgaWYoIGF0b2koYXJndlswXSkgPD0gaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwpIHsKKyAgICAgIGlyZHAtPk1pbkFkdmVydEludGVydmFsID0gYXRvaShhcmd2WzBdKTsKKworICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOworICB9CisKKyAgdnR5X291dCAodnR5LCAiSUNNUCB3YXJuaW5nIG1heGFkdmVydGludGVydmFsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBtaW5hZHZlcnRpbnRlcnZhbCVzIiwgCisJICAgICBWVFlfTkVXTElORSk7CisKKyAgdnR5X291dCAodnR5LCAiUGxlYXNlIGNvcnJlY3QhJXMiLCAKKwkgICAgIFZUWV9ORVdMSU5FKTsKKyAgcmV0dXJuIENNRF9XQVJOSU5HOworfQorCitERUZVTiAoaXBfaXJkcF9tYXhhZHZlcnRpbnRlcnZhbCwKKyAgICAgICBpcF9pcmRwX21heGFkdmVydGludGVydmFsX2NtZCwKKyAgICAgICAiaXAgaXJkcCBtYXhhZHZlcnRpbnRlcnZhbCA8NC0xODAwPiIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJTZXQgbWF4aW11bSB0aW1lIGJldHdlZW4gYWR2ZXJ0aXNlbWVudFxuIgorICAgICAgICJNYXhpbXVtIGFkdmVydGlzZW1lbnQgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKworICBpZiggaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPD0gYXRvaShhcmd2WzBdKSApIHsKKyAgICBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisKKyAgICAgIHJldHVybiBDTURfU1VDQ0VTUzsKKyAgfQorCisgIHZ0eV9vdXQgKHZ0eSwgIklDTVAgd2FybmluZyBtYXhhZHZlcnRpbnRlcnZhbCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gbWluYWR2ZXJ0aW50ZXJ2YWwlcyIsIAorCSAgICAgVlRZX05FV0xJTkUpOworCisgIHZ0eV9vdXQgKHZ0eSwgIlBsZWFzZSBjb3JyZWN0ISVzIiwgCisJICAgICBWVFlfTkVXTElORSk7CisgIHJldHVybiBDTURfV0FSTklORzsKK30KKworREVGVU4gKGlwX2lyZHBfcHJlZmVyZW5jZSwKKyAgICAgICBpcF9pcmRwX3ByZWZlcmVuY2VfY21kLAorCisgICAgICAgLyogREVGVU4gbmVlZHMgdG8gYmUgZml4ZWQgZm9yIG5lZ2F0aXZlIHJhbmFnZXMuLi4KKwkgIEJlIHBvc2l0aXZlIGZvciBub3cuIDotKQorCisJICAiaXAgaXJkcCBwcmVmZXJlbmNlIDwtMjE0NzQ4MzY0OC0yMTQ3NDgzNjQ3PiIsCisJKi8KKworCisgICAgICAgImlwIGlyZHAgcHJlZmVyZW5jZSA8MC0yMTQ3NDgzNjQ3PiIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJTZXQgZGVmYXVsdCBwcmVmZXJlbmNlIGxldmVsIGZvciB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJQcmVmZXJlbmNlIGxldmVsXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworICBpcmRwLT5QcmVmZXJlbmNlID0gYXRvaShhcmd2WzBdKTsKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2UsCisgICAgICAgaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2VfY21kLAorICAgICAgICJpcCBpcmRwIGFkZHJlc3MgQS5CLkMuRCBwcmVmZXJlbmNlIDwwLTIxNDc0ODM2NDc+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiQWx0ZXIgSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2VcbiIKKyAgICAgICAiU3BlY2lmeSBJUkRQIG5vbi1kZWZhdWx0IHByZWZlcmVuY2UgdG8gYWR2ZXJ0aXNlXG4iCisgICAgICAgIlNldCBJUkRQIGFkZHJlc3MgZm9yIGFkdmVydGlzZVxuIgorICAgICAgICJQcmVmZXJlbmNlIGxldmVsXG4iKQoreworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgaW5fYWRkciBpcDsgCisgIGludCBwcmVmOworICBpbnQgcmV0OworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgc3RydWN0IEFkdiAqYWR2OworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgcmV0ID0gaW5ldF9hdG9uKGFyZ3ZbMF0sICZpcCk7CisgIGlmKCFyZXQpIHJldHVybiBDTURfV0FSTklORzsKKworICBwcmVmID0gYXRvaShhcmd2WzFdKTsKKworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXJkcC0+QWR2UHJlZkxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKwkgIGFkdiA9IGdldGRhdGEgKG5vZGUpOworICAgICAgaWYoYWR2LT5pcC5zX2FkZHIgPT0gaXAuc19hZGRyKSByZXR1cm4gQ01EX1NVQ0NFU1M7CisgIH0KKworICBhZHYgPSBBZHZfbmV3KCk7CisgIGFkdi0+aXAgPSBpcDsKKyAgYWR2LT5wcmVmID0gcHJlZjsKKyAgbGlzdG5vZGVfYWRkKGlyZHAtPkFkdlByZWZMaXN0LCBhZHYpOworCisgIHJldHVybiBDTURfU1VDQ0VTUzsKKworfQorCitERUZVTiAoaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2Vfbm8sCisgICAgICAgaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2VfY21kX25vLAorICAgICAgICJubyBpcCBpcmRwIGFkZHJlc3MgQS5CLkMuRCBwcmVmZXJlbmNlIDwwLTIxNDc0ODM2NDc+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiQWx0ZXIgSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2VcbiIKKyAgICAgICAiUmVtb3ZlcyBJUkRQIG5vbi1kZWZhdWx0IHByZWZlcmVuY2VcbiIKKyAgICAgICAiU2VsZWN0IElSRFAgYWRkcmVzc1xuIgorICAgICAgICJPbGQgcHJlZmVyZW5jZSBsZXZlbFxuIikKK3sKKyAgbGlzdG5vZGUgbm9kZTsKKyAgc3RydWN0IGluX2FkZHIgaXA7IAorICBpbnQgcHJlZjsKKyAgaW50IHJldDsKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIHN0cnVjdCBBZHYgKmFkdjsKKworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIHJldCA9IGluZXRfYXRvbihhcmd2WzBdLCAmaXApOworICBpZighcmV0KSByZXR1cm4gQ01EX1dBUk5JTkc7CisKKyAgcHJlZiA9IGF0b2koYXJndlsxXSk7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlyZHAtPkFkdlByZWZMaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7CisJICBhZHYgPSBnZXRkYXRhIChub2RlKTsKKwkgIGlmKGFkdi0+aXAuc19hZGRyID09IGlwLnNfYWRkciApIHsKKwkJICBsaXN0bm9kZV9kZWxldGUoaXJkcC0+QWR2UHJlZkxpc3QsIGFkdik7CisJCSAgYnJlYWs7CisJICB9CisgIH0KKworICByZXR1cm4gQ01EX1NVQ0NFU1M7CisKKworfQorCitERUZVTiAoaXBfaXJkcF9kZWJ1Z19tZXNzYWdlcywKKyAgICAgICBpcF9pcmRwX2RlYnVnX21lc3NhZ2VzX2NtZCwKKyAgICAgICAiaXAgaXJkcCBkZWJ1ZyBtZXNzYWdlcyIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworICBpcmRwLT5mbGFncyB8PSBJRl9ERUJVR19NRVNTQUdFUzsKKworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX2RlYnVnX21pc2MsCisgICAgICAgaXBfaXJkcF9kZWJ1Z19taXNjX2NtZCwKKyAgICAgICAiaXAgaXJkcCBkZWJ1ZyBtaXNjIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IGRlYnVnIEF2ZXJ0cy4gYW5kIFNvbGljaXRzIChzaG9ydClcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX01JU0M7CisKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTiAoaXBfaXJkcF9kZWJ1Z19wYWNrZXQsCisgICAgICAgaXBfaXJkcF9kZWJ1Z19wYWNrZXRfY21kLAorICAgICAgICJpcCBpcmRwIGRlYnVnIHBhY2tldCIsCisgICAgICAgSVBfU1RSCisgICAgICAgIklDTVAgUm91dGVyIGRpc2NvdmVyeSBkZWJ1ZyBBdmVydHMuIGFuZCBTb2xpY2l0cyAoc2hvcnQpXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworICBpcmRwLT5mbGFncyB8PSBJRl9ERUJVR19QQUNLRVQ7CisKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOIChpcF9pcmRwX2RlYnVnX2Rpc2FibGUsCisgICAgICAgaXBfaXJkcF9kZWJ1Z19kaXNhYmxlX2NtZCwKKyAgICAgICAiaXAgaXJkcCBkZWJ1ZyBkaXNhYmxlIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IGRlYnVnIEF2ZXJ0cy4gYW5kIFNvbGljaXRzIChzaG9ydClcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPmZsYWdzICY9IH5JRl9ERUJVR19QQUNLRVQ7CisgIGlyZHAtPmZsYWdzICY9IH5JRl9ERUJVR19NRVNTQUdFUzsKKyAgaXJkcC0+ZmxhZ3MgJj0gfklGX0RFQlVHX01JU0M7CisKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworfQorCit2b2lkCitpcmRwX2lmX2luaXQgKCkKK3sKKyAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfYnJvYWRjYXN0X2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX211bHRpY2FzdF9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9jbWRfbm8pOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9zaHV0ZG93bl9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9ub19zaHV0ZG93bl9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9ob2xkdGltZV9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9tYXhhZHZlcnRpbnRlcnZhbF9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9taW5hZHZlcnRpbnRlcnZhbF9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9wcmVmZXJlbmNlX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9hZGRyZXNzX3ByZWZlcmVuY2VfY21kX25vKTsKKworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19tZXNzYWdlc19jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19taXNjX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX3BhY2tldF9jbWQpOworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9kZWJ1Z19kaXNhYmxlX2NtZCk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lSRFAgKi8KZGlmZiAtLWdpdCBhL3plYnJhL2lyZHBfbWFpbi5jIGIvemVicmEvaXJkcF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNmFlYQotLS0gL2Rldi9udWxsCisrKyBiL3plYnJhL2lyZHBfbWFpbi5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgUm9iZXJ0IE9sc3Nvbi4KKyAqIFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4gIAorICovCisKKy8qIAorICogVGhpcyB3b3JrIGluY2x1ZGVzIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIGNvcHl3cml0ZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAgS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKi8KKworLyogCisgKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqIGZvciByZXZpZXdpbmcgYW5kIHRlc3RzLgorICovCisKKworI2luY2x1ZGUgPHplYnJhLmg+CisKKyNpZmRlZiBIQVZFX0lSRFAKKworI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAidnR5LmgiCisjaW5jbHVkZSAic29ja3VuaW9uLmgiCisjaW5jbHVkZSAicHJlZml4LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgInN0cmVhbS5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAiY29ubmVjdGVkLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiemNsaWVudC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInplYnJhL2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCisjaW5jbHVkZSAiemVicmEvcmliLmgiCisjaW5jbHVkZSAiemVicmEvenNlcnYuaCIKKyNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKKyNpbmNsdWRlICJ6ZWJyYS9pcmRwLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisKKyNpbmNsdWRlICJpZi5oIgorI2luY2x1ZGUgInNvY2t1bmlvbi5oIgorI2luY2x1ZGUgImxvZy5oIgorCisvKiBHTE9CQUwgVkFSUyAqLworCisvKiBNYXN0ZXIgb2YgdGhyZWFkcy4gKi8KK2V4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CitzdHJ1Y3QgdGhyZWFkICp0X2lyZHBfcmF3OworCisvKiBUaW1lciBpbnRlcnZhbCBvZiBpcmRwLiAqLworaW50IGlyZHBfdGltZXJfaW50ZXJ2YWwgPSBJUkRQX0RFRkFVTFRfSU5URVJWQUw7CisKK2ludCBpcmRwX3JlYWRfcmF3KHN0cnVjdCB0aHJlYWQgKnIpOworaW50IGluX2Nrc3VtICh2b2lkICpwdHIsIGludCBuYnl0ZXMpOworZXh0ZXJuIGludCBpcmRwX3NvY2s7Cit2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCisJCSBzdHJ1Y3Qgc3RyZWFtICpzLAorCQkgdV9pbnQzMl90IGRzdCwKKwkJIHN0cnVjdCBwcmVmaXggKnAsCisJCSB1X2ludDMyX3QgdHRsKTsKKwordm9pZCBpcmRwX2lmX2luaXQgKCk7CisKK2NoYXIgKgoraW5ldF8yYSh1X2ludDMyX3QgYSwgY2hhciAqYikKK3sKKyAgc3ByaW50ZihiLCAiJXUuJXUuJXUuJXUiLCAKKyAgICAgICAgICAoYSAgICApICYgMHhGRiwKKyAgICAgICAgICAoYT4+IDgpICYgMHhGRiwgCisgICAgICAgICAgKGE+PjE2KSAmIDB4RkYsIAorICAgICAgICAgIChhPj4yNCkgJiAweEZGKTsKKyAgcmV0dXJuICBiOworfQorCitpbnQKK2lyZHBfc29ja19pbml0ICh2b2lkKQoreworICBpbnQgcmV0LCBpOworCisgIGlyZHBfc29jayA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fSUNNUCk7CisgIGlmIChpcmRwX3NvY2sgPCAwKSB7CisgICAgemxvZ193YXJuICgiSVJEUDogY2FuJ3QgY3JlYXRlIGlyZHAgc29ja2V0ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gaXJkcF9zb2NrOworICB9OworICAKKyAgaSA9IDE7CisgIHJldCA9IHNldHNvY2tvcHQgKGlyZHBfc29jaywgSVBQUk9UT19JUCwgSVBfVFRMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZpLCBzaXplb2YgKGkpKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICB6bG9nX3dhcm4gKCJJUkRQOiBjYW4ndCBkbyBpcmRwIHNvY2tvcHQgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiByZXQ7CisgIH07CisgIAorICBpID0gMTsKKyAgcmV0ID0gc2V0c29ja29wdCAoaXJkcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9QS1RJTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZpLCBzaXplb2YgKGkpKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICB6bG9nX3dhcm4gKCJJUkRQOiBjYW4ndCBkbyBpcmRwIHNvY2tvcHQgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiByZXQ7CisgIH07CisKKyAgdF9pcmRwX3JhdyA9IHRocmVhZF9hZGRfcmVhZCAoemVicmFkLm1hc3RlciwgaXJkcF9yZWFkX3JhdywgTlVMTCwgaXJkcF9zb2NrKTsgCisKKyAgcmV0dXJuIGlyZHBfc29jazsKK30KKworCitpbnQgZ2V0X3ByZWYoc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwLCBzdHJ1Y3QgcHJlZml4ICpwKQoreworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgQWR2ICphZHY7CisKKyAgLyogVXNlIGRlZmF1bHQgcHJlZmVyZW5jZSBvciB1c2UgdGhlIG92ZXJyaWRlIHByZWYgKi8KKyAgCisgIGlmKCBpcmRwLT5BZHZQcmVmTGlzdCA9PSBOVUxMICkgcmV0dXJuIGlyZHAtPlByZWZlcmVuY2U7CisgIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXJkcC0+QWR2UHJlZkxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKyAgICBhZHYgPSBnZXRkYXRhIChub2RlKTsKKyAgICBpZiggcC0+dS5wcmVmaXg0LnNfYWRkciA9PSBhZHYtPmlwLnNfYWRkciApCisgICAgICByZXR1cm4gYWR2LT5wcmVmOworICB9CisgIHJldHVybiBpcmRwLT5QcmVmZXJlbmNlOworfQorCisvKiBNYWtlIElDTVAgUm91dGVyIEFkdmVydGlzZW1lbnQgTWVzc2FnZS4gKi8KK2ludCBtYWtlX2FkdmVydGlzZW1lbnRfcGFja2V0IChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAorCQkJICAgICAgIHN0cnVjdCBwcmVmaXggKnAsCisJCQkgICAgICAgc3RydWN0IHN0cmVhbSAqcykKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIGludCBzaXplOworICBpbnQgcHJlZjsKKyAgdV9pbnQxNl90IGNoZWNrc3VtOworCisgIHByZWYgPSAgZ2V0X3ByZWYoaXJkcCwgcCk7CisKKyAgc3RyZWFtX3B1dGMgKHMsIElDTVBfUk9VVEVSQURWRVJUKTsgLyogVHlwZS4gKi8KKyAgc3RyZWFtX3B1dGMgKHMsIDApOwkJLyogQ29kZS4gKi8KKyAgc3RyZWFtX3B1dHcgKHMsIDApOwkJLyogQ2hlY2tzdW0uICovCisgIHN0cmVhbV9wdXRjIChzLCAxKTsJCS8qIE51bSBhZGRyZXNzLiAqLworICBzdHJlYW1fcHV0YyAocywgMik7CQkvKiBBZGRyZXNzIEVudHJ5IFNpemUuICovCisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTikgIAorICAgIHN0cmVhbV9wdXR3IChzLCAwKTsKKyAgZWxzZSAKKyAgICBzdHJlYW1fcHV0dyAocywgaXJkcC0+TGlmZXRpbWUpOworCisgIHN0cmVhbV9wdXRsIChzLCBodG9ubChwLT51LnByZWZpeDQuc19hZGRyKSk7IC8qIFJvdXRlciBhZGRyZXNzLiAqLworICBzdHJlYW1fcHV0bCAocywgcHJlZik7CisKKyAgLyogaW5fY2tzdW0gcmV0dXJuIG5ldHdvcmsgYnl0ZSBvcmRlciB2YWx1ZSAqLworICBzaXplID0gMTY7CisgIGNoZWNrc3VtID0gaW5fY2tzdW0gKHMtPmRhdGEsIHNpemUpOworICBzdHJlYW1fcHV0d19hdCAocywgMiwgaHRvbnMoY2hlY2tzdW0pKTsKKworICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCBpcmRwX3NlbmQoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKKwkgICAgICAgc3RydWN0IHByZWZpeCAqcCwgCisJICAgICAgIHN0cnVjdCBzdHJlYW0gKnMpCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICB1X2ludDMyX3QgZHN0OworICB1X2ludDMyX3QgdHRsPTE7CisKKyAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm47IAorCisgIGlmIChpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCkgCisgICAgZHN0ID1JTkFERFJfQlJPQURDQVNUIDsKKyAgZWxzZSAKKyAgICBkc3QgPSBodG9ubChJTkFERFJfQUxMSE9TVFNfR1JPVVApOworCisgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUVTU0FHRVMpIAorICAgIHpsb2dfd2FybigiSVJEUDogVFggQWR2ZXJ0IG9uICVzICVzLyVkIEhvbGR0aW1lPSVkIFByZWZlcmVuY2U9JWQiLCAKKwkgICAgICBpZnAtPm5hbWUsCisJICAgICAgaW5ldF9udG9hKHAtPnUucHJlZml4NCksIAorCSAgICAgIHAtPnByZWZpeGxlbiwKKwkgICAgICBpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOPyAwIDogaXJkcC0+TGlmZXRpbWUsCisJICAgICAgZ2V0X3ByZWYoaXJkcCwgcCkpOworCisgIHNlbmRfcGFja2V0IChpZnAsIHMsIGRzdCwgcCwgdHRsKTsKK30KKwordm9pZCBpcmRwX2FkdmVydGlzZW1lbnQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCisJCSAgIHN0cnVjdCBwcmVmaXggKnApCit7CisgIHN0cnVjdCBzdHJlYW0gKnM7CisgIHMgPSBzdHJlYW1fbmV3ICgxMjgpOworICBtYWtlX2FkdmVydGlzZW1lbnRfcGFja2V0IChpZnAsIHAsIHMpOworICBpcmRwX3NlbmQoaWZwLCBwLCBzKTsgCit9CisKK2ludCBpcmRwX3NlbmRfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKnRfYWR2ZXJ0KQoreworICB1X2ludDMyX3QgdGltZXIsIHRtcDsKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwID0gVEhSRUFEX0FSRyAodF9hZHZlcnQpOworICBzdHJ1Y3QgemVicmFfaWYgKnppPWlmcC0+aW5mbzsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKKyAgc3RydWN0IHByZWZpeCAqcDsKKyAgbGlzdG5vZGUgbm9kZTsKKyAgc3RydWN0IGNvbm5lY3RlZCAqaWZjOworCisgIGlyZHAtPmZsYWdzICY9IH5JRl9TT0xJQ0lUOworCisgIGlmKGlmcC0+Y29ubmVjdGVkKSAKKyAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKyAgICAgIGlmYyA9IGdldGRhdGEgKG5vZGUpOworCisgICAgICBwID0gaWZjLT5hZGRyZXNzOworCisgICAgICBpcmRwX2FkdmVydGlzZW1lbnQoaWZwLCBwKTsKKyAgICAgIGlyZHAtPmlyZHBfc2VudCsrOworCisgICAgfQorCisgIHRtcCA9IGlyZHAtPk1heEFkdmVydEludGVydmFsLWlyZHAtPk1pbkFkdmVydEludGVydmFsOworICB0aW1lciA9ICAocmFuZG9tICgpICUgdG1wICkgKyAxOworICB0aW1lciA9IGlyZHAtPk1pbkFkdmVydEludGVydmFsICsgdGltZXI7CisKKyAgaWYoaXJkcC0+aXJkcF9zZW50IDwgIE1BWF9JTklUSUFMX0FEVkVSVElTRU1FTlRTICYmCisgICAgIHRpbWVyID4gTUFYX0lOSVRJQUxfQURWRVJUX0lOVEVSVkFMICkgCisJICB0aW1lcj0gTUFYX0lOSVRJQUxfQURWRVJUX0lOVEVSVkFMOworCisgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykKKyAgICB6bG9nX3dhcm4oIklSRFA6IE5ldyB0aW1lciBmb3IgJXMgc2V0IHRvICV1XG4iLCBpZnAtPm5hbWUsIHRpbWVyKTsKKworICBpcmRwLT50X2FkdmVydGlzZSA9IHRocmVhZF9hZGRfdGltZXIoemVicmFkLm1hc3RlciwgaXJkcF9zZW5kX3RocmVhZCwgaWZwLCB0aW1lcik7CisgIHJldHVybiAwOworfQorCit2b2lkIGlyZHBfYWR2ZXJ0X29mZihzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICBsaXN0bm9kZSBub2RlOworICBpbnQgaTsKKyAgc3RydWN0IGNvbm5lY3RlZCAqaWZjOworICBzdHJ1Y3QgcHJlZml4ICpwOworCisgIGlmKGlyZHAtPnRfYWR2ZXJ0aXNlKSAgdGhyZWFkX2NhbmNlbChpcmRwLT50X2FkdmVydGlzZSk7CisgIGlyZHAtPnRfYWR2ZXJ0aXNlID0gTlVMTDsKKyAgCisgIGlmKGlmcC0+Y29ubmVjdGVkKSAKKyAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKyAgICAgIGlmYyA9IGdldGRhdGEgKG5vZGUpOworCisgICAgICBwID0gaWZjLT5hZGRyZXNzOworCisgICAgICAvKiBPdXRwdXQgc29tZSBwYWNrZXRzIHdpdGggTGlmZXRpbWUgMCAKKwkgd2Ugc2hvdWxkIGFkZCBhIHdhaXQuLi4KKyAgICAgICovCisKKyAgICAgIGZvcihpPTA7IGk8IElSRFBfTEFTVF9BRFZFUlRfTUVTU0FHRVM7IGkrKykgeworCisJaXJkcC0+aXJkcF9zZW50Kys7CisJaXJkcF9hZHZlcnRpc2VtZW50KGlmcCwgcCk7CisgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgcHJvY2Vzc19zb2xpY2l0IChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICB1X2ludDMyX3QgdGltZXI7CisKKyAgLyogV2hlbiBTT0xJQ0lUIGlzIGFjdGl2ZSB3ZSByZWplY3QgZnVydGhlciBpbmNvbWluZyBzb2xpY2l0cyAKKyAgICAgdGhpcyBrZWVwcyBkb3duIHRoZSBhbnN3ZXJpbmcgcmF0ZSBzbyB3ZSBkb24ndCBoYXZlIHRoaW5rCisgICAgIGFib3V0IERvUyBhdHRhY2tzIGhlcmUuICovCisKKyAgaWYoIGlyZHAtPmZsYWdzICYgSUZfU09MSUNJVCkgcmV0dXJuOworCisgIGlyZHAtPmZsYWdzIHw9IElGX1NPTElDSVQ7CisgIGlmKGlyZHAtPnRfYWR2ZXJ0aXNlKSAgdGhyZWFkX2NhbmNlbChpcmRwLT50X2FkdmVydGlzZSk7CisgIGlyZHAtPnRfYWR2ZXJ0aXNlID0gTlVMTDsKKworICB0aW1lciA9ICAocmFuZG9tICgpICUgTUFYX1JFU1BPTlNFX0RFTEFZKSArIDE7CisKKyAgaXJkcC0+dF9hZHZlcnRpc2UgPSB0aHJlYWRfYWRkX3RpbWVyKHplYnJhZC5tYXN0ZXIsIAorCQkJCSAgICAgICBpcmRwX3NlbmRfdGhyZWFkLCAKKwkJCQkgICAgICAgaWZwLCAKKwkJCQkgICAgICAgdGltZXIpOworfQorCit2b2lkIGlyZHBfZmluaXNoKCkKK3sKKworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKworICB6bG9nX3dhcm4oIklSRFA6IFJlY2VpdmVkIHNodXRkb3duIG5vdGlmaWNhdGlvbi4iKTsKKyAgCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpZmxpc3QpOyBub2RlOyBub2RlID0gbmV4dG5vZGUgKG5vZGUpKQorICAgIHsKKyAgICAgIGlmcCA9IGdldGRhdGEobm9kZSk7CisgICAgICB6aT0gaWZwLT5pbmZvOworICAgICAgaWYoISB6aSkgY29udGludWU7CisgICAgICBpcmRwID0gJnppLT5pcmRwOworICAgICAgaWYoIWlyZHApIGNvbnRpbnVlOworCisgICAgICBpZihpcmRwLT5mbGFncyAmIElGX0FDVElWRSApIHsKKwlpcmRwLT5mbGFncyB8PSBJRl9TSFVURE9XTjsKKwlpcmRwX2FkdmVydF9vZmYoaWZwKTsKKyAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgaXJkcF9pbml0KCkKK3sKKyAgaXJkcF9zb2NrX2luaXQoKTsKKyAgaXJkcF9pZl9pbml0ICgpOworfQorCisKKworI2VuZGlmIC8qIEhBVkVfSVJEUCAqLworCisKKworCmRpZmYgLS1naXQgYS96ZWJyYS9pcmRwX3BhY2tldC5jIGIvemVicmEvaXJkcF9wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDdkNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvemVicmEvaXJkcF9wYWNrZXQuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIFJvYmVydCBPbHNzb24uCisgKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuICAKKyAqLworCisvKiAKKyAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwIEt1bmloaXJvIElzaGlndXJvCisgKgorICovCisKKy8qIAorICogVGhhbmtzIHRvIEplbnMgTOXlcyBhdCBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCisgKiBmb3IgcmV2aWV3aW5nIGFuZCB0ZXN0cy4KKyAqLworCisKKyNpbmNsdWRlIDx6ZWJyYS5oPgorCisKKyNpZmRlZiBIQVZFX0lSRFAKKworI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAidnR5LmgiCisjaW5jbHVkZSAic29ja3VuaW9uLmgiCisjaW5jbHVkZSAicHJlZml4LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgInN0cmVhbS5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAiY29ubmVjdGVkLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiemNsaWVudC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInplYnJhL2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCisjaW5jbHVkZSAiemVicmEvcmliLmgiCisjaW5jbHVkZSAiemVicmEvenNlcnYuaCIKKyNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKKyNpbmNsdWRlICJ6ZWJyYS9pcmRwLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSAiaWYuaCIKKyNpbmNsdWRlICJzb2NrdW5pb24uaCIKKyNpbmNsdWRlICJsb2cuaCIKKworCisKKy8qIEdMT0JBTCBWQVJTICovCisKK2ludCBpcmRwX3NvY2s7CitjaGFyIGIxWzE2XSwgYjJbMTZdLCBiM1sxNl0sIGI0WzE2XTsgIC8qIEZvciBpbmV0XzJhICovCisKK2V4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CitleHRlcm4gc3RydWN0IHRocmVhZCAqdF9pcmRwX3JhdzsKK2V4dGVybiBzdHJ1Y3QgaW50ZXJmYWNlICpnZXRfaWZsaXN0X2lmcChpbnQgaWR4KTsKK2ludCBpbl9ja3N1bSAodm9pZCAqcHRyLCBpbnQgbmJ5dGVzKTsKK3ZvaWQgcHJvY2Vzc19zb2xpY2l0IChzdHJ1Y3QgaW50ZXJmYWNlICppZnApOworCit2b2lkIHBhcnNlX2lyZHBfcGFja2V0KGNoYXIgKnAsIAorCQkgIGludCBsZW4sIAorCQkgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IGlwICppcCA9IChzdHJ1Y3QgaXAgKilwIDsKKyAgc3RydWN0IGljbXBoZHIgKmljbXA7CisgIHN0cnVjdCBpbl9hZGRyIHNyYzsKKyAgaW50IGlwX2hsZW4sIGlwX2xlbjsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworCisgIHppID0gaWZwLT5pbmZvOworICBpZighemkpIHJldHVybjsKKworICBpcmRwID0gJnppLT5pcmRwOworICBpZighaXJkcCkgcmV0dXJuOworCisgIGlwX2hsZW4gPSBpcC0+aXBfaGwqNDsgCisgIGlwX2xlbiA9IG50b2hzKGlwLT5pcF9sZW4pOworICBsZW4gPSBsZW4gLSBpcF9obGVuOworICBzcmMgPSBpcC0+aXBfc3JjOworCisgIGlmKGlwX2xlbiA8IElDTVBfTUlOTEVOKSB7CisgICAgemxvZ19lcnIgKCJJUkRQOiBSWCBJQ01QIHBhY2tldCB0b28gc2hvcnQgZnJvbSAlc1xuIiwKKwkgICAgICBpbmV0X250b2EgKHNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIENoZWNrIHNvIHdlIGRvbid0IGNoZWNrc3VtIHBhY2tldHMgbG9uZ2VyIHRoYW4gb3VyZSBSWF9CVUYgLSAoZXRobGVuICsKKyAgIGxlbiBvZiBJUC1oZWFkZXIpIDE0KzIwICovCisKKyAgaWYoaXBfbGVuID4gSVJEUF9SWF9CVUYtMzQpIHsKKyAgICB6bG9nX2VyciAoIklSRFA6IFJYIElDTVAgcGFja2V0IHRvbyBsb25nIGZyb20gJXNcbiIsCisJICAgICAgaW5ldF9udG9hIChzcmMpKTsKKyAgICByZXR1cm47CisgIH0KKworCisgIGlmIChpbl9ja3N1bSAoaXAsIGlwX2xlbikpIHsKKyAgICB6bG9nX3dhcm4gKCJJUkRQOiBSWCBJQ01QIHBhY2tldCBmcm9tICVzLiBCYWQgY2hlY2tzdW0sIHNpbGVudGx5IGlnbm9yZWQiLAorCSAgICAgICBpbmV0X250b2EgKHNyYykpOworICAgIHJldHVybjsKKyAgfQorCisgIGljbXAgPSAoc3RydWN0IGljbXBoZHIgKikgKHAraXBfaGxlbik7CisKKworICAvKiBIYW5kbGUganVzdCBvbmx5IElSRFAgKi8KKworICBpZiggaWNtcC0+dHlwZSA9PSBJQ01QX1JPVVRFUkFEVkVSVCk7CisgIGVsc2UgaWYoIGljbXAtPnR5cGUgPT0gSUNNUF9ST1VURVJTT0xJQ0lUKTsKKyAgZWxzZSByZXR1cm47CisKKyAKKyAgaWYgKGljbXAtPmNvZGUgIT0gMCkgeworICAgIHpsb2dfd2FybiAoIklSRFA6IFJYIHBhY2tldCB0eXBlICVkIGZyb20gJXMuIEJhZCBJQ01QIHR5cGUgY29kZSwgc2lsZW50bHkgaWdub3JlZCIsCisJICAgICAgIGljbXAtPnR5cGUsCisJICAgICAgIGluZXRfbnRvYSAoc3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoaXAtPmlwX2RzdC5zX2FkZHIgPT0gSU5BRERSX0JST0FEQ0FTVCAmJiAKKyAgICAgaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1QpOworCisgIGVsc2UgaWYgKCBudG9obChpcC0+aXBfZHN0LnNfYWRkcikgPT0gSU5BRERSX0FMTFJUUlNfR1JPVVAgJiYgCisJICAgICEgKGlyZHAtPmZsYWdzICYgIElGX0JST0FEQ0FTVCkpOworCisgIGVsc2UgeyAvKiBFUlJPUiAqLworCisgICAgemxvZ193YXJuICgiSVJEUDogUlggaWxsZWdhbCBmcm9tICVzIHRvICVzIHdoaWxlICVzIG9wZXJhdGVzIGluICVzXG4iLAorCSAgICAgICBpbmV0X250b2EgKHNyYyksIAorCSAgICAgICBudG9obChpcC0+aXBfZHN0LnNfYWRkcikgPT0gSU5BRERSX0FMTFJUUlNfR1JPVVA/IAorCSAgICAgICAibXVsdGljYXN0IiA6IGluZXRfbnRvYShpcC0+aXBfZHN0KSwKKwkgICAgICAgaWZwLT5uYW1lLAorCSAgICAgICBpcmRwLT5mbGFncyAmICBJRl9CUk9BRENBU1Q/IAorCSAgICAgICAiYnJvYWRjYXN0IiA6ICJtdWx0aWNhc3QiKTsKKworICAgIHpsb2dfd2FybiAoIklSRFA6IFBsZWFzZSBjb3JyZWN0IHNldHRpbmdzXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKGljbXAtPnR5cGUpIAorICAgIHsKKyAgICBjYXNlIElDTVBfUk9VVEVSQURWRVJUOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElDTVBfUk9VVEVSU09MSUNJVDoKKworICAgICAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NRVNTQUdFUykgCisJemxvZ193YXJuICgiSVJEUDogUlggU29saWNpdCBvbiAlcyBmcm9tICVzXG4iLAorCQkgICBpZnAtPm5hbWUsCisJCSAgIGluZXRfbnRvYSAoc3JjKSk7CisKKyAgICAgIHByb2Nlc3Nfc29saWNpdChpZnApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgemxvZ193YXJuICgiSVJEUDogUlggdHlwZSAlZCBmcm9tICVzLiBCYWQgSUNNUCB0eXBlLCBzaWxlbnRseSBpZ25vcmVkIiwKKwkJIGljbXAtPnR5cGUsCisJCSBpbmV0X250b2EgKHNyYykpOworICAgIH0KK30KKwwKK2ludCBpcmRwX3JlY3Ztc2cgKGludCBzb2NrLCAKKwkgICAgICB1X2NoYXIgKmJ1ZiwgCisJICAgICAgaW50IHNpemUsIAorCSAgICAgIGludCAqaWZpbmRleCkKK3sKKyAgc3RydWN0IG1zZ2hkciBtc2c7CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgIHN0cnVjdCBjbXNnaGRyICpwdHI7CisgIGNoYXIgYWRhdGFbMTAyNF07CisgIGludCByZXQ7CisKKyAgbXNnLm1zZ19uYW1lID0gKHZvaWQgKikwOworICBtc2cubXNnX25hbWVsZW4gPSAwOworICBtc2cubXNnX2lvdiA9ICZpb3Y7CisgIG1zZy5tc2dfaW92bGVuID0gMTsKKyAgbXNnLm1zZ19jb250cm9sID0gKHZvaWQgKikgYWRhdGE7CisgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZiBhZGF0YTsKKworICBpb3YuaW92X2Jhc2UgPSBidWY7CisgIGlvdi5pb3ZfbGVuID0gc2l6ZTsKKworICByZXQgPSByZWN2bXNnIChzb2NrLCAmbXNnLCAwKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICB6bG9nX3dhcm4oIklSRFA6IHJlY3Ztc2c6IHJlYWQgZXJyb3IgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworICAgIHpsb2dfd2FybigiSVJEUDogcmVjdm1zZzogdHJ1bmNhdGVkIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChtc2cubXNnX2ZsYWdzICYgTVNHX0NUUlVOQykgeworICAgIHpsb2dfd2FybigiSVJEUDogcmVjdm1zZzogdHJ1bmNhdGVkIGNvbnRyb2wgbWVzc2FnZSIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBmb3IgKHB0ciA9IENNU0dfRklSU1RIRFIoJm1zZyk7IHB0ciA7IHB0ciA9IENNU0dfTlhUSERSKCZtc2csIHB0cikpCisgICAgaWYgKHB0ci0+Y21zZ19sZXZlbCA9PSBTT0xfSVAgJiYgcHRyLT5jbXNnX3R5cGUgPT0gSVBfUEtUSU5GTykgCisgICAgICB7CisgICAgICAgIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOworICAgICAgICAgICBwa3RpbmZvID0gKHN0cnVjdCBpbl9wa3RpbmZvICopIENNU0dfREFUQSAocHRyKTsKKyAgICAgICAgKmlmaW5kZXggPSBwa3RpbmZvLT5pcGlfaWZpbmRleDsKKyAgICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKwwKK2ludCBpcmRwX3JlYWRfcmF3KHN0cnVjdCB0aHJlYWQgKnIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBjaGFyIGJ1ZltJUkRQX1JYX0JVRl07CisgIGludCByZXQsIGlmaW5kZXg7CisgIAorICBpbnQgaXJkcF9zb2NrID0gVEhSRUFEX0ZEIChyKTsKKyAgdF9pcmRwX3JhdyA9IHRocmVhZF9hZGRfcmVhZCAoemVicmFkLm1hc3RlciwgaXJkcF9yZWFkX3JhdywgTlVMTCwgaXJkcF9zb2NrKTsKKyAgCisgIHJldCA9IGlyZHBfcmVjdm1zZyAoaXJkcF9zb2NrLCBidWYsIElSRFBfUlhfQlVGLCAgJmlmaW5kZXgpOworIAorICBpZiAocmV0IDwgMCkgemxvZ193YXJuICgiSVJEUDogUlggRXJyb3IgbGVuZ3RoID0gJWQiLCByZXQpOworCisgIGlmcCA9IGdldF9pZmxpc3RfaWZwKGlmaW5kZXgpOworICBpZighIGlmcCApIHJldHVybiByZXQ7CisKKyAgemk9IGlmcC0+aW5mbzsKKyAgaWYoISB6aSApIHJldHVybiByZXQ7CisKKyAgaXJkcCA9ICZ6aS0+aXJkcDsKKyAgaWYoISBpcmRwICkgcmV0dXJuIHJldDsKKworICBpZighIChpcmRwLT5mbGFncyAmIElGX0FDVElWRSkpIHsKKworICAgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfTUlTQykgCisgICAgICB6bG9nX3dhcm4oIklSRFA6IFJYIElDTVAgZm9yIGRpc2FibGVkIGludGVyZmFjZSAlc1xuIiwKKwkJaWZwLT5uYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKGlyZHAtPmZsYWdzICYgSUZfREVCVUdfUEFDS0VUKSB7CisgICAgaW50IGk7CisgICAgemxvZ193YXJuKCJJUkRQOiBSWCAoaWR4ICVkKSAiLCBpZmluZGV4KTsKKyAgICBmb3IoaT0wOyBpIDwgcmV0OyBpKyspIHpsb2dfd2FybiggIklSRFA6IFJYICV4ICIsIGJ1ZltpXSYweEZGKTsKKyAgfQorCisgIHBhcnNlX2lyZHBfcGFja2V0KGJ1ZiwgcmV0LCBpZnApOworICByZXR1cm4gcmV0OworfQorDAordm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAorCSAgICBzdHJ1Y3Qgc3RyZWFtICpzLAorCSAgICB1X2ludDMyX3QgZHN0LAorCSAgICBzdHJ1Y3QgcHJlZml4ICpwLAorCSAgICB1X2ludDMyX3QgdHRsKQoreworICBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luIHNvY2tkc3QgPSB7QUZfSU5FVH07CisgIHN0cnVjdCBpcCAqaXA7CisgIHN0cnVjdCBpY21waGRyICppY21wOworICBzdHJ1Y3QgbXNnaGRyICptc2c7CisgIHN0cnVjdCBjbXNnaGRyICpjbXNnOworICBzdHJ1Y3QgaW92ZWMgaW92ZWN0b3I7CisgIGNoYXIgbXNnYnVmWzI1Nl07CisgIGNoYXIgYnVmWzI1Nl07CisgIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOworICB1X2xvbmcgc3JjOworICBpbnQgb247CisgCisgIGlmICghIChpZnAtPmZsYWdzICYgSUZGX1VQKSkgcmV0dXJuOworCisgIGlmKCFwKSBzcmMgPSBudG9obChwLT51LnByZWZpeDQuc19hZGRyKTsKKyAgZWxzZSBzcmMgPSAwOyAvKiBJcyBmaWxsZWQgaW4gKi8KKyAgCisgIGlwID0gKHN0cnVjdCBpcCAqKSBidWY7CisgIGlwLT5pcF9obCA9IHNpemVvZihzdHJ1Y3QgaXApID4+IDI7CisgIGlwLT5pcF92ID0gSVBWRVJTSU9OOworICBpcC0+aXBfdG9zID0gMHhDMDsKKyAgaXAtPmlwX29mZiA9IDBMOworICBpcC0+aXBfcCA9IDE7ICAgICAgIC8qIElQX0lDTVAgKi8KKyAgaXAtPmlwX3R0bCA9IHR0bDsKKyAgaXAtPmlwX3NyYy5zX2FkZHIgPSBzcmM7CisgIGlwLT5pcF9kc3Quc19hZGRyID0gZHN0OworICBpY21wID0gKHN0cnVjdCBpY21waGRyICopIChidWYgKyAyMCk7CisKKyAgLyogTWVyZ2UgSVAgaGVhZGVyIHdpdGggaWNtcCBwYWNrZXQgKi8KKworICBzdHJlYW1fZ2V0KGljbXAsIHMsIHMtPnB1dHApOworCisgIC8qIGljbXAtPmNoZWNrc3VtIGlzIGFscmVhZHkgY2FsY3VsYXRlZCAqLworICBpcC0+aXBfbGVuICA9IHNpemVvZihzdHJ1Y3QgaXApICsgcy0+cHV0cDsKKyAgc3RyZWFtX2ZyZWUocyk7IAorCisgIG9uID0gMTsKKyAgaWYgKHNldHNvY2tvcHQoaXJkcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9IRFJJTkNMLAorCQkgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKSA8IDApCisgICAgemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKKworCisgIGlmKGRzdCA9PSBJTkFERFJfQlJPQURDQVNUICkgeworICAgIG9uID0gMTsKKyAgICBpZiAoc2V0c29ja29wdChpcmRwX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwKKwkJICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKSA8IDApCisgICAgICB6bG9nX3dhcm4oInNlbmR0byAlcyIsIHN0cmVycm9yIChlcnJubykpOworICB9CisKKyAgaWYoZHN0ICE9ICBJTkFERFJfQlJPQURDQVNUKSB7CisgICAgICBvbiA9IDA7IAorICAgICAgaWYoIHNldHNvY2tvcHQoaXJkcF9zb2NrLElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9MT09QLCAKKwkJICAgICAoY2hhciAqKSZvbixzaXplb2Yob24pKSA8IDApCisJemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgfQorCisgIGJ6ZXJvKCZzb2NrZHN0LHNpemVvZihzb2NrZHN0KSk7CisgIHNvY2tkc3Quc2luX2ZhbWlseT1BRl9JTkVUOworICBzb2NrZHN0LnNpbl9hZGRyLnNfYWRkciA9IGRzdDsKKworICBjbXNnID0gKHN0cnVjdCBjbXNnaGRyICopIChtc2didWYgKyBzaXplb2Yoc3RydWN0IG1zZ2hkcikpOworICBjbXNnLT5jbXNnX2xlbiA9IHNpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pOworICBjbXNnLT5jbXNnX2xldmVsID0gU09MX0lQOworICBjbXNnLT5jbXNnX3R5cGUgPSBJUF9QS1RJTkZPOworICBwa3RpbmZvID0gKHN0cnVjdCBpbl9wa3RpbmZvICopIENNU0dfREFUQShjbXNnKTsKKyAgcGt0aW5mby0+aXBpX2lmaW5kZXggPSBpZnAtPmlmaW5kZXg7CisgIHBrdGluZm8tPmlwaV9zcGVjX2RzdC5zX2FkZHIgPSBzcmM7CisgIHBrdGluZm8tPmlwaV9hZGRyLnNfYWRkciA9IHNyYzsKKyAKKyAgaW92ZWN0b3IuaW92X2Jhc2UgPSAodm9pZCAqKSBidWY7CisgIGlvdmVjdG9yLmlvdl9sZW4gPSBpcC0+aXBfbGVuOyAKKyAgbXNnID0gKHN0cnVjdCBtc2doZHIgKikgbXNnYnVmOworICBtc2ctPm1zZ19uYW1lID0gJnNvY2tkc3Q7CisgIG1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc29ja2RzdCk7CisgIG1zZy0+bXNnX2lvdiA9ICZpb3ZlY3RvcjsKKyAgbXNnLT5tc2dfaW92bGVuID0gMTsKKyAgbXNnLT5tc2dfY29udHJvbCA9IGNtc2c7CisgIG1zZy0+bXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKyAKKyAgaWYgKHNlbmRtc2coaXJkcF9zb2NrLCBtc2csIDApIDwgMCkgeworICAgIHpsb2dfd2Fybigic2VuZHRvICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgIH0KKyAgLyogICBwcmludGYoIlRYIG9uICVzIGlkeCAlZFxuIiwgaWZwLT5uYW1lLCBpZnAtPmlmaW5kZXgpOyAqLworfQorCisKKyNlbmRpZiAvKiBIQVZFX0lSRFAgKi8KKworCisKZGlmZiAtLWdpdCBhL3plYnJhL21haW4uYyBiL3plYnJhL21haW4uYwppbmRleCBlZmM5NTY0Li4zMzg0ZDdkIDEwMDY0NAotLS0gYS96ZWJyYS9tYWluLmMKKysrIGIvemVicmEvbWFpbi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiemVicmEvenNlcnYuaCIKICNpbmNsdWRlICJ6ZWJyYS9kZWJ1Zy5oIgogI2luY2x1ZGUgInplYnJhL3JpYi5oIgorI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKIAogLyogWmVicmEgaW5zdGFuY2UgKi8KIHN0cnVjdCB6ZWJyYV90IHplYnJhZCA9CkBAIC0xNTEsNiArMTUyLDkgQEAKIAogICBpZiAoIXJldGFpbl9tb2RlKQogICAgIHJpYl9jbG9zZSAoKTsKKyNpZmRlZiBIQVZFX0lSRFAKKyAgaXJkcF9maW5pc2goKTsKKyNlbmRpZgogCiAgIGV4aXQgKDApOwogfQpAQCAtMjg5LDYgKzI5Myw5IEBACiAgIHplYnJhX3Z0eV9pbml0ICgpOwogICBhY2Nlc3NfbGlzdF9pbml0ICgpOwogICBydGFkdl9pbml0ICgpOworI2lmZGVmIEhBVkVfSVJEUAorICBpcmRwX2luaXQoKTsKKyNlbmRpZgogCiAgIC8qIEZvciBkZWJ1ZyBwdXJwb3NlLiAqLwogICAvKiBTRVRfRkxBRyAoemVicmFfZGVidWdfZXZlbnQsIFpFQlJBX0RFQlVHX0VWRU5UKTsgKi8K