ZGlmZiAtLWdpdCBhL2xpYmMvQW5kcm9pZC5tayBiL2xpYmMvQW5kcm9pZC5tawppbmRleCAwOGM5ZGRkLi41MDllMzVjIDEwMDY0NAotLS0gYS9saWJjL0FuZHJvaWQubWsKKysrIGIvbGliYy9BbmRyb2lkLm1rCkBAIC01NCw3ICs1NCw2IEBACiAgICAgYmlvbmljL2luaXRncm91cHMuYyBcCiAgICAgYmlvbmljL2lvY3RsLmMgXAogICAgIGJpb25pYy9pc2F0dHkuYyBcCi0gICAgYmlvbmljL21kNS5jIFwKICAgICBiaW9uaWMvbWVtbWVtLmMgXAogICAgIGJpb25pYy9wYXRoY29uZi5jIFwKICAgICBiaW9uaWMvcHRzbmFtZS5jIFwKZGlmZiAtLWdpdCBhL2xpYmMvYmlvbmljL21kNS5jIGIvbGliYy9iaW9uaWMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGFhZWQuLjAwMDAwMDAKLS0tIGEvbGliYy9iaW9uaWMvbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NSAtIDIwMDEgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCi0gKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIAotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLQotX19SQ1NJRCgiJEhlaW1kYWw6IG1kNS5jLHYgMS4xNSAyMDAxLzAxLzI5IDA0OjMzOjQ0IGFzc2FyIEV4cCAkIgotICAgICAgICAiJE5ldEJTRDogbWQ1LmMsdiAxLjEuMS40IDIwMDIvMDkvMTIgMTI6NDE6NDIgam9kYSBFeHAgJCIpOwotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlICJtZDUuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0KLSNkZWZpbmUgQSBtLT5jb3VudGVyWzBdCi0jZGVmaW5lIEIgbS0+Y291bnRlclsxXQotI2RlZmluZSBDIG0tPmNvdW50ZXJbMl0KLSNkZWZpbmUgRCBtLT5jb3VudGVyWzNdCi0jZGVmaW5lIFggZGF0YQotCi12b2lkCi1NRDVfSW5pdCAoc3RydWN0IG1kNSAqbSkKLXsKLSAgbS0+c3pbMF0gPSAwOwotICBtLT5zelsxXSA9IDA7Ci0gIEQgPSAweDEwMzI1NDc2OwotICBDID0gMHg5OGJhZGNmZTsKLSAgQiA9IDB4ZWZjZGFiODk7Ci0gIEEgPSAweDY3NDUyMzAxOwotfQotCi0jZGVmaW5lIEYoeCx5LHopIENSQVlGSVgoKHggJiB5KSB8ICh+eCAmIHopKQotI2RlZmluZSBHKHgseSx6KSBDUkFZRklYKCh4ICYgeikgfCAoeSAmIH56KSkKLSNkZWZpbmUgSCh4LHkseikgKHggXiB5IF4geikKLSNkZWZpbmUgSSh4LHkseikgQ1JBWUZJWCh5IF4gKHggfCB+eikpCi0KLSNkZWZpbmUgRE9JVChhLGIsYyxkLGsscyxpLE9QKSBcCi1hID0gYiArIGNzaGlmdChhICsgT1AoYixjLGQpICsgWFtrXSArIChpKSwgcykKLQotI2RlZmluZSBETzEoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEYpCi0jZGVmaW5lIERPMihhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksRykKLSNkZWZpbmUgRE8zKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxIKQotI2RlZmluZSBETzQoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2FsYyAoc3RydWN0IG1kNSAqbSwgdV9pbnQzMl90ICpkYXRhKQotewotICB1X2ludDMyX3QgQUEsIEJCLCBDQywgREQ7Ci0KLSAgQUEgPSBBOwotICBCQiA9IEI7Ci0gIENDID0gQzsKLSAgREQgPSBEOwotCi0gIC8qIFJvdW5kIDEgKi8KLQotICBETzEoQSxCLEMsRCwwLDcsMHhkNzZhYTQ3OCk7Ci0gIERPMShELEEsQixDLDEsMTIsMHhlOGM3Yjc1Nik7Ci0gIERPMShDLEQsQSxCLDIsMTcsMHgyNDIwNzBkYik7Ci0gIERPMShCLEMsRCxBLDMsMjIsMHhjMWJkY2VlZSk7Ci0KLSAgRE8xKEEsQixDLEQsNCw3LDB4ZjU3YzBmYWYpOwotICBETzEoRCxBLEIsQyw1LDEyLDB4NDc4N2M2MmEpOwotICBETzEoQyxELEEsQiw2LDE3LDB4YTgzMDQ2MTMpOwotICBETzEoQixDLEQsQSw3LDIyLDB4ZmQ0Njk1MDEpOwotCi0gIERPMShBLEIsQyxELDgsNywweDY5ODA5OGQ4KTsKLSAgRE8xKEQsQSxCLEMsOSwxMiwweDhiNDRmN2FmKTsKLSAgRE8xKEMsRCxBLEIsMTAsMTcsMHhmZmZmNWJiMSk7Ci0gIERPMShCLEMsRCxBLDExLDIyLDB4ODk1Y2Q3YmUpOwotCi0gIERPMShBLEIsQyxELDEyLDcsMHg2YjkwMTEyMik7Ci0gIERPMShELEEsQixDLDEzLDEyLDB4ZmQ5ODcxOTMpOwotICBETzEoQyxELEEsQiwxNCwxNywweGE2Nzk0MzhlKTsKLSAgRE8xKEIsQyxELEEsMTUsMjIsMHg0OWI0MDgyMSk7Ci0KLSAgLyogUm91bmQgMiAqLwotCi0gIERPMihBLEIsQyxELDEsNSwweGY2MWUyNTYyKTsKLSAgRE8yKEQsQSxCLEMsNiw5LDB4YzA0MGIzNDApOwotICBETzIoQyxELEEsQiwxMSwxNCwweDI2NWU1YTUxKTsKLSAgRE8yKEIsQyxELEEsMCwyMCwweGU5YjZjN2FhKTsKLQotICBETzIoQSxCLEMsRCw1LDUsMHhkNjJmMTA1ZCk7Ci0gIERPMihELEEsQixDLDEwLDksMHgyNDQxNDUzKTsKLSAgRE8yKEMsRCxBLEIsMTUsMTQsMHhkOGExZTY4MSk7Ci0gIERPMihCLEMsRCxBLDQsMjAsMHhlN2QzZmJjOCk7Ci0KLSAgRE8yKEEsQixDLEQsOSw1LDB4MjFlMWNkZTYpOwotICBETzIoRCxBLEIsQywxNCw5LDB4YzMzNzA3ZDYpOwotICBETzIoQyxELEEsQiwzLDE0LDB4ZjRkNTBkODcpOwotICBETzIoQixDLEQsQSw4LDIwLDB4NDU1YTE0ZWQpOwotCi0gIERPMihBLEIsQyxELDEzLDUsMHhhOWUzZTkwNSk7Ci0gIERPMihELEEsQixDLDIsOSwweGZjZWZhM2Y4KTsKLSAgRE8yKEMsRCxBLEIsNywxNCwweDY3NmYwMmQ5KTsKLSAgRE8yKEIsQyxELEEsMTIsMjAsMHg4ZDJhNGM4YSk7Ci0KLSAgLyogUm91bmQgMyAqLwotCi0gIERPMyhBLEIsQyxELDUsNCwweGZmZmEzOTQyKTsKLSAgRE8zKEQsQSxCLEMsOCwxMSwweDg3NzFmNjgxKTsKLSAgRE8zKEMsRCxBLEIsMTEsMTYsMHg2ZDlkNjEyMik7Ci0gIERPMyhCLEMsRCxBLDE0LDIzLDB4ZmRlNTM4MGMpOwotCi0gIERPMyhBLEIsQyxELDEsNCwweGE0YmVlYTQ0KTsKLSAgRE8zKEQsQSxCLEMsNCwxMSwweDRiZGVjZmE5KTsKLSAgRE8zKEMsRCxBLEIsNywxNiwweGY2YmI0YjYwKTsKLSAgRE8zKEIsQyxELEEsMTAsMjMsMHhiZWJmYmM3MCk7Ci0KLSAgRE8zKEEsQixDLEQsMTMsNCwweDI4OWI3ZWM2KTsKLSAgRE8zKEQsQSxCLEMsMCwxMSwweGVhYTEyN2ZhKTsKLSAgRE8zKEMsRCxBLEIsMywxNiwweGQ0ZWYzMDg1KTsKLSAgRE8zKEIsQyxELEEsNiwyMywweDQ4ODFkMDUpOwotCi0gIERPMyhBLEIsQyxELDksNCwweGQ5ZDRkMDM5KTsKLSAgRE8zKEQsQSxCLEMsMTIsMTEsMHhlNmRiOTllNSk7Ci0gIERPMyhDLEQsQSxCLDE1LDE2LDB4MWZhMjdjZjgpOwotICBETzMoQixDLEQsQSwyLDIzLDB4YzRhYzU2NjUpOwotCi0gIC8qIFJvdW5kIDQgKi8KLQotICBETzQoQSxCLEMsRCwwLDYsMHhmNDI5MjI0NCk7Ci0gIERPNChELEEsQixDLDcsMTAsMHg0MzJhZmY5Nyk7Ci0gIERPNChDLEQsQSxCLDE0LDE1LDB4YWI5NDIzYTcpOwotICBETzQoQixDLEQsQSw1LDIxLDB4ZmM5M2EwMzkpOwotCi0gIERPNChBLEIsQyxELDEyLDYsMHg2NTViNTljMyk7Ci0gIERPNChELEEsQixDLDMsMTAsMHg4ZjBjY2M5Mik7Ci0gIERPNChDLEQsQSxCLDEwLDE1LDB4ZmZlZmY0N2QpOwotICBETzQoQixDLEQsQSwxLDIxLDB4ODU4NDVkZDEpOwotCi0gIERPNChBLEIsQyxELDgsNiwweDZmYTg3ZTRmKTsKLSAgRE80KEQsQSxCLEMsMTUsMTAsMHhmZTJjZTZlMCk7Ci0gIERPNChDLEQsQSxCLDYsMTUsMHhhMzAxNDMxNCk7Ci0gIERPNChCLEMsRCxBLDEzLDIxLDB4NGUwODExYTEpOwotCi0gIERPNChBLEIsQyxELDQsNiwweGY3NTM3ZTgyKTsKLSAgRE80KEQsQSxCLEMsMTEsMTAsMHhiZDNhZjIzNSk7Ci0gIERPNChDLEQsQSxCLDIsMTUsMHgyYWQ3ZDJiYik7Ci0gIERPNChCLEMsRCxBLDksMjEsMHhlYjg2ZDM5MSk7Ci0KLSAgQSArPSBBQTsKLSAgQiArPSBCQjsKLSAgQyArPSBDQzsKLSAgRCArPSBERDsKLX0KLQotLyoKLSAqIEZyb20gYFBlcmZvcm1hbmNlIGFuYWx5c2lzIG9mIE1ENScgYnkgSm9zZXBoIEQuIFRvdWNoIDx0b3VjaEBpc2kuZWR1PgotICovCi0jaWYgIWRlZmluZWQoX19CWVRFX09SREVSKSB8fCAhZGVmaW5lZCAoX19CSUdfRU5ESUFOKQotI2Vycm9yIF9fQllURV9PUkRFUiBtYWNyb3Mgbm90IGRlZmluZWQKLSNlbmRpZgotCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotc3RhdGljIGlubGluZSB1X2ludDMyX3QKLXN3YXBfdV9pbnQzMl90ICh1X2ludDMyX3QgdCkKLXsKLSAgdV9pbnQzMl90IHRlbXAxLCB0ZW1wMjsKLQotICB0ZW1wMSAgID0gY3NoaWZ0KHQsIDE2KTsKLSAgdGVtcDIgICA9IHRlbXAxID4+IDg7Ci0gIHRlbXAxICAmPSAweDAwZmYwMGZmOwotICB0ZW1wMiAgJj0gMHgwMGZmMDBmZjsKLSAgdGVtcDEgPDw9IDg7Ci0gIHJldHVybiB0ZW1wMSB8IHRlbXAyOwotfQotI2VuZGlmCi0KLXN0cnVjdCB4MzJ7Ci0gIHVuc2lnbmVkIGludCBhOjMyOwotICB1bnNpZ25lZCBpbnQgYjozMjsKLX07Ci0KLXZvaWQKLU1ENV9VcGRhdGUgKHN0cnVjdCBtZDUgKm0sIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSB2OwotICBzaXplX3Qgb2xkX3N6ID0gbS0+c3pbMF07Ci0gIHNpemVfdCBvZmZzZXQ7Ci0KLSAgbS0+c3pbMF0gKz0gbGVuICogODsKLSAgaWYgKG0tPnN6WzBdIDwgb2xkX3N6KQotICAgICAgKyttLT5zelsxXTsKLSAgb2Zmc2V0ID0gKG9sZF9zeiAvIDgpICAlIDY0OwotICB3aGlsZShsZW4gPiAwKXsKLSAgICBzaXplX3QgbCA9IG1pbihsZW4sIDY0IC0gb2Zmc2V0KTsKLSAgICBtZW1jcHkobS0+c2F2ZSArIG9mZnNldCwgcCwgbCk7Ci0gICAgb2Zmc2V0ICs9IGw7Ci0gICAgcCArPSBsOwotICAgIGxlbiAtPSBsOwotICAgIGlmKG9mZnNldCA9PSA2NCl7Ci0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotICAgICAgaW50IGk7Ci0gICAgICB1X2ludDMyX3QgY3VycmVudFsxNl07Ci0gICAgICBzdHJ1Y3QgeDMyICp1ID0gKHN0cnVjdCB4MzIqKW0tPnNhdmU7Ci0gICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspewotCWN1cnJlbnRbMippKzBdID0gc3dhcF91X2ludDMyX3QodVtpXS5hKTsKLQljdXJyZW50WzIqaSsxXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYik7Ci0gICAgICB9Ci0gICAgICBjYWxjKG0sIGN1cnJlbnQpOwotI2Vsc2UKLSAgICAgIGNhbGMobSwgKHVfaW50MzJfdCopbS0+c2F2ZSk7Ci0jZW5kaWYKLSAgICAgIG9mZnNldCA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQKLU1ENV9GaW5hbCAodm9pZCAqcmVzLCBzdHJ1Y3QgbWQ1ICptKQotewotICB1bnNpZ25lZCBjaGFyIHplcm9zWzcyXTsKLSAgdW5zaWduZWQgb2Zmc2V0ID0gKG0tPnN6WzBdIC8gOCkgJSA2NDsKLSAgdW5zaWduZWQgaW50IGRzdGFydCA9ICgxMjAgLSBvZmZzZXQgLSAxKSAlIDY0ICsgMTsKLQotICAqemVyb3MgPSAweDgwOwotICBtZW1zZXQgKHplcm9zICsgMSwgMCwgc2l6ZW9mKHplcm9zKSAtIDEpOwotICB6ZXJvc1tkc3RhcnQrMF0gPSAobS0+c3pbMF0gPj4gMCkgJiAweGZmOwotICB6ZXJvc1tkc3RhcnQrMV0gPSAobS0+c3pbMF0gPj4gOCkgJiAweGZmOwotICB6ZXJvc1tkc3RhcnQrMl0gPSAobS0+c3pbMF0gPj4gMTYpICYgMHhmZjsKLSAgemVyb3NbZHN0YXJ0KzNdID0gKG0tPnN6WzBdID4+IDI0KSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCs0XSA9IChtLT5zelsxXSA+PiAwKSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCs1XSA9IChtLT5zelsxXSA+PiA4KSAmIDB4ZmY7Ci0gIHplcm9zW2RzdGFydCs2XSA9IChtLT5zelsxXSA+PiAxNikgJiAweGZmOwotICB6ZXJvc1tkc3RhcnQrN10gPSAobS0+c3pbMV0gPj4gMjQpICYgMHhmZjsKLSAgTUQ1X1VwZGF0ZSAobSwgemVyb3MsIGRzdGFydCArIDgpOwotICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnIgPSAodW5zaWduZWQgY2hhciAqKXJlczsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotCSAgcls0KmldICAgPSBtLT5jb3VudGVyW2ldICYgMHhGRjsKLQkgIHJbNCppKzFdID0gKG0tPmNvdW50ZXJbaV0gPj4gOCkgJiAweEZGOwotCSAgcls0KmkrMl0gPSAobS0+Y291bnRlcltpXSA+PiAxNikgJiAweEZGOwotCSAgcls0KmkrM10gPSAobS0+Y291bnRlcltpXSA+PiAyNCkgJiAweEZGOwotICAgICAgfQotICB9Ci0jaWYgMAotICB7Ci0gICAgaW50IGk7Ci0gICAgdV9pbnQzMl90ICpyID0gKHVfaW50MzJfdCAqKXJlczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0gICAgICByW2ldID0gc3dhcF91X2ludDMyX3QgKG0tPmNvdW50ZXJbaV0pOwotICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xpYmMvYmlvbmljL21kNS5oIGIvbGliYy9iaW9uaWMvbWQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODE5OTQuLjAwMDAwMDAKLS0tIGEvbGliYy9iaW9uaWMvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KLSAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiAkSGVpbWRhbDogbWQ1LmgsdiAxLjggMjAwMS8wMS8yOSAwMjowODo1NyBhc3NhciBFeHAgJAotICAgJE5ldEJTRDogbWQ1LmgsdiAxLjEuMS40IDIwMDIvMDkvMTIgMTI6NDE6NDIgam9kYSBFeHAgJCAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLXN0cnVjdCBtZDUgewotICB1bnNpZ25lZCBpbnQgc3pbMl07Ci0gIHVfaW50MzJfdCBjb3VudGVyWzRdOwotICB1bnNpZ25lZCBjaGFyIHNhdmVbNjRdOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbWQ1IE1ENV9DVFg7Ci0KLXZvaWQgTUQ1X0luaXQgKHN0cnVjdCBtZDUgKm0pOwotdm9pZCBNRDVfVXBkYXRlIChzdHJ1Y3QgbWQ1ICptLCBjb25zdCB2b2lkICpwLCBzaXplX3QgbGVuKTsKLXZvaWQgTUQ1X0ZpbmFsICh2b2lkICpyZXMsIHN0cnVjdCBtZDUgKm0pOyAvKiB1X2ludDMyX3QgcmVzWzRdICovCg==