ZGlmZiAtLWdpdCBhL2h3L2RzMTIyNXkuYyBiL2h3L2RzMTIyNXkuYwppbmRleCAyYjNmMDJlLi4zYjkxYjRmIDEwMDY0NAotLS0gYS9ody9kczEyMjV5LmMKKysrIGIvaHcvZHMxMjI1eS5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIFFFTVUgTlZSQU0gZW11bGF0aW9uIGZvciBEUzEyMjVZIGNoaXAKLSAqIAotICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUKLSAqIAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEhlcnbpIFBvdXNzaW5lYXUKKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwpAQCAtMjYsOTggKzI2LDE2OSBAQAogI2luY2x1ZGUgIm1pcHMuaCIKICNpbmNsdWRlICJudnJhbS5oIgogCi10eXBlZGVmIGVudW0KLXsKLSAgICBub25lID0gMCwKLSAgICByZWFkbW9kZSwKLSAgICB3cml0ZW1vZGUsCi19IG52cmFtX29wZW5fbW9kZTsKKy8vI2RlZmluZSBERUJVR19OVlJBTQogCi1zdHJ1Y3QgZHMxMjI1eV90Cit0eXBlZGVmIHN0cnVjdCBkczEyMjV5X3QKIHsKICAgICB0YXJnZXRfcGh5c19hZGRyX3QgbWVtX2Jhc2U7Ci0gICAgdWludDMyX3QgY2FwYWNpdHk7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgdWludDMyX3QgY2hpcF9zaXplOwogICAgIFFFTVVGaWxlICpmaWxlOwotICAgIG52cmFtX29wZW5fbW9kZSBvcGVuX21vZGU7Ci19OworICAgIHVpbnQ4X3QgKmNvbnRlbnRzOworICAgIHVpbnQ4X3QgcHJvdGVjdGlvbjsKK30gZHMxMjI1eV90OwogCi1zdGF0aWMgaW50IGRzMTIyNXlfc2V0X3RvX21vZGUoZHMxMjI1eV90ICpOVlJBTSwgbnZyYW1fb3Blbl9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmZpbGVtb2RlKQotewotICAgIGlmIChOVlJBTS0+b3Blbl9tb2RlICE9IG1vZGUpCi0gICAgewotICAgICAgICBpZiAoTlZSQU0tPmZpbGUpCi0gICAgICAgICAgICBxZW11X2ZjbG9zZShOVlJBTS0+ZmlsZSk7Ci0gICAgICAgIE5WUkFNLT5maWxlID0gcWVtdV9mb3BlbihOVlJBTS0+ZmlsZW5hbWUsIGZpbGVtb2RlKTsKLSAgICAgICAgTlZSQU0tPm9wZW5fbW9kZSA9IG1vZGU7Ci0gICAgfQotICAgIHJldHVybiAoTlZSQU0tPmZpbGUgIT0gTlVMTCk7Ci19CiAKIHN0YXRpYyB1aW50MzJfdCBudnJhbV9yZWFkYiAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKIHsKLSAgICBkczEyMjV5X3QgKk5WUkFNID0gb3BhcXVlOworICAgIGRzMTIyNXlfdCAqcyA9IG9wYXF1ZTsKICAgICBpbnQ2NF90IHBvczsKKyAgICB1aW50MzJfdCB2YWw7CiAKLSAgICBwb3MgPSBhZGRyIC0gTlZSQU0tPm1lbV9iYXNlOwotICAgIGlmIChhZGRyID49IE5WUkFNLT5jYXBhY2l0eSkKLSAgICAgICAgYWRkciAtPSBOVlJBTS0+Y2FwYWNpdHk7CisgICAgcG9zID0gYWRkciAtIHMtPm1lbV9iYXNlOworICAgIGlmIChwb3MgPj0gcy0+Y2hpcF9zaXplKQorICAgICAgICBwb3MgLT0gcy0+Y2hpcF9zaXplOwogCi0gICAgaWYgKCFkczEyMjV5X3NldF90b19tb2RlKE5WUkFNLCByZWFkbW9kZSwgInJiIikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHFlbXVfZnNlZWsoTlZSQU0tPmZpbGUsIHBvcywgU0VFS19TRVQpOwotICAgIHJldHVybiAodWludDMyX3QpcWVtdV9nZXRfYnl0ZShOVlJBTS0+ZmlsZSk7CisgICAgdmFsID0gcy0+Y29udGVudHNbcG9zXTsKKworI2lmZGVmIERFQlVHX05WUkFNCisgICAgcHJpbnRmKCJudnJhbTogcmVhZCAweCV4IGF0ICIgVEFSR0VUX0ZNVF9seCAiXG4iLCB2YWwsIGFkZHIpOworI2VuZGlmCisgICAgcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHZvaWQgbnZyYW1fd3JpdGViICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyLCB1aW50MzJfdCB2YWx1ZSkKK3N0YXRpYyB1aW50MzJfdCBudnJhbV9yZWFkdyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKIHsKLSAgICBkczEyMjV5X3QgKk5WUkFNID0gb3BhcXVlOworICAgIHVpbnQzMl90IHY7CisgICAgdiA9IG52cmFtX3JlYWRiKG9wYXF1ZSwgYWRkcik7CisgICAgdiB8PSBudnJhbV9yZWFkYihvcGFxdWUsIGFkZHIgKyAxKSA8PCA4OworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgdWludDMyX3QgbnZyYW1fcmVhZGwgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIpCit7CisgICAgdWludDMyX3QgdjsKKyAgICB2ID0gbnZyYW1fcmVhZGIob3BhcXVlLCBhZGRyKTsKKyAgICB2IHw9IG52cmFtX3JlYWRiKG9wYXF1ZSwgYWRkciArIDEpIDw8IDg7CisgICAgdiB8PSBudnJhbV9yZWFkYihvcGFxdWUsIGFkZHIgKyAyKSA8PCAxNjsKKyAgICB2IHw9IG52cmFtX3JlYWRiKG9wYXF1ZSwgYWRkciArIDMpIDw8IDI0OworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCBudnJhbV93cml0ZWIgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBkczEyMjV5X3QgKnMgPSBvcGFxdWU7CiAgICAgaW50NjRfdCBwb3M7CiAKLSAgICBwb3MgPSBhZGRyIC0gTlZSQU0tPm1lbV9iYXNlOwotICAgIGlmIChkczEyMjV5X3NldF90b19tb2RlKE5WUkFNLCB3cml0ZW1vZGUsICJ3YiIpKQotICAgIHsKLSAgICAgICAgcWVtdV9mc2VlayhOVlJBTS0+ZmlsZSwgcG9zLCBTRUVLX1NFVCk7Ci0gICAgICAgIHFlbXVfcHV0X2J5dGUoTlZSQU0tPmZpbGUsIChpbnQpdmFsdWUpOworI2lmZGVmIERFQlVHX05WUkFNCisgICAgcHJpbnRmKCJudnJhbTogd3JpdGUgMHgleCBhdCAiIFRBUkdFVF9GTVRfbHggIlxuIiwgdmFsLCBhZGRyKTsKKyNlbmRpZgorCisgICAgcG9zID0gYWRkciAtIHMtPm1lbV9iYXNlOworICAgIHMtPmNvbnRlbnRzW3Bvc10gPSB2YWwgJiAweGZmOworICAgIGlmIChzLT5maWxlKSB7CisgICAgICAgIHFlbXVfZnNlZWsocy0+ZmlsZSwgcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIHFlbXVfcHV0X2J5dGUocy0+ZmlsZSwgKGludCl2YWwpOworICAgICAgICBxZW11X2ZmbHVzaChzLT5maWxlKTsKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIG52cmFtX3dyaXRldyAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIG52cmFtX3dyaXRlYihvcGFxdWUsIGFkZHIsIHZhbCAmIDB4ZmYpOworICAgIG52cmFtX3dyaXRlYihvcGFxdWUsIGFkZHIgKyAxLCAodmFsID4+IDgpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIG52cmFtX3dyaXRlbCAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIG52cmFtX3dyaXRlYihvcGFxdWUsIGFkZHIsIHZhbCAmIDB4ZmYpOworICAgIG52cmFtX3dyaXRlYihvcGFxdWUsIGFkZHIgKyAxLCAodmFsID4+IDgpICYgMHhmZik7CisgICAgbnZyYW1fd3JpdGViKG9wYXF1ZSwgYWRkciArIDIsICh2YWwgPj4gMTYpICYgMHhmZik7CisgICAgbnZyYW1fd3JpdGViKG9wYXF1ZSwgYWRkciArIDMsICh2YWwgPj4gMjQpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIG52cmFtX3dyaXRlYl9wcm90ZWN0ZWQgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBkczEyMjV5X3QgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAocy0+cHJvdGVjdGlvbiAhPSA3KSB7CisjaWZkZWYgREVCVUdfTlZSQU0KKyAgICBwcmludGYoIm52cmFtOiBwcmV2ZW50IHdyaXRlIG9mIDB4JXggYXQgIiBUQVJHRVRfRk1UX2x4ICJcbiIsIHZhbCwgYWRkcik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG52cmFtX3dyaXRlYihvcGFxdWUsIGFkZHIgLSBzLT5jaGlwX3NpemUsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIG52cmFtX3dyaXRld19wcm90ZWN0ZWQgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBudnJhbV93cml0ZWJfcHJvdGVjdGVkKG9wYXF1ZSwgYWRkciwgdmFsICYgMHhmZik7CisgICAgbnZyYW1fd3JpdGViX3Byb3RlY3RlZChvcGFxdWUsIGFkZHIgKyAxLCAodmFsID4+IDgpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIG52cmFtX3dyaXRlbF9wcm90ZWN0ZWQgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBudnJhbV93cml0ZWJfcHJvdGVjdGVkKG9wYXF1ZSwgYWRkciwgdmFsICYgMHhmZik7CisgICAgbnZyYW1fd3JpdGViX3Byb3RlY3RlZChvcGFxdWUsIGFkZHIgKyAxLCAodmFsID4+IDgpICYgMHhmZik7CisgICAgbnZyYW1fd3JpdGViX3Byb3RlY3RlZChvcGFxdWUsIGFkZHIgKyAyLCAodmFsID4+IDE2KSAmIDB4ZmYpOworICAgIG52cmFtX3dyaXRlYl9wcm90ZWN0ZWQob3BhcXVlLCBhZGRyICsgMywgKHZhbCA+PiAyNCkgJiAweGZmKTsKK30KKwogc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpudnJhbV9yZWFkW10gPSB7CiAgICAgJm52cmFtX3JlYWRiLAotICAgIE5VTEwsCi0gICAgTlVMTCwKKyAgICAmbnZyYW1fcmVhZHcsCisgICAgJm52cmFtX3JlYWRsLAogfTsKIAogc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqbnZyYW1fd3JpdGVbXSA9IHsKICAgICAmbnZyYW1fd3JpdGViLAotICAgIE5VTEwsCi0gICAgTlVMTCwKKyAgICAmbnZyYW1fd3JpdGV3LAorICAgICZudnJhbV93cml0ZWwsCiB9OwogCi1zdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpudnJhbV9ub25lW10gPSB7Ci0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpudnJhbV93cml0ZV9wcm90ZWN0ZWRbXSA9IHsKKyAgICAmbnZyYW1fd3JpdGViX3Byb3RlY3RlZCwKKyAgICAmbnZyYW1fd3JpdGV3X3Byb3RlY3RlZCwKKyAgICAmbnZyYW1fd3JpdGVsX3Byb3RlY3RlZCwKIH07CiAKIC8qIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgKi8KLWRzMTIyNXlfdCAqZHMxMjI1eV9pbml0KHRhcmdldF9waHlzX2FkZHJfdCBtZW1fYmFzZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit2b2lkICpkczEyMjV5X2luaXQodGFyZ2V0X3BoeXNfYWRkcl90IG1lbV9iYXNlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBkczEyMjV5X3QgKnM7Ci0gICAgaW50IG1lbV9pbmRleDEsIG1lbV9pbmRleDI7CisgICAgaW50IG1lbV9pbmRleFJXLCBtZW1faW5kZXhSUDsKKyAgICBRRU1VRmlsZSAqZmlsZTsKIAogICAgIHMgPSBxZW11X21hbGxvY3ooc2l6ZW9mKGRzMTIyNXlfdCkpOwogICAgIGlmICghcykKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcy0+Y2hpcF9zaXplID0gMHgyMDAwOyAvKiBGaXhlZCBmb3IgZHMxMjI1eSBjaGlwOiA4IEtpQiAqLworICAgIHMtPmNvbnRlbnRzID0gcWVtdV9tYWxsb2N6KHMtPmNoaXBfc2l6ZSk7CisgICAgaWYgKCFzLT5jb250ZW50cykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcy0+bWVtX2Jhc2UgPSBtZW1fYmFzZTsKLSAgICBzLT5jYXBhY2l0eSA9IDB4MjAwMDsgLyogRml4ZWQgZm9yIGRzMTIyNXkgY2hpcDogOEsgKi8KLSAgICBzLT5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIHMtPnByb3RlY3Rpb24gPSA3OworCisgICAgLyogUmVhZCBjdXJyZW50IGZpbGUgKi8KKyAgICBmaWxlID0gcWVtdV9mb3BlbihmaWxlbmFtZSwgInJiIik7CisgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgLyogUmVhZCBudnJhbSBjb250ZW50cyAqLworICAgICAgICBxZW11X2dldF9idWZmZXIoZmlsZSwgcy0+Y29udGVudHMsIHMtPmNoaXBfc2l6ZSk7CisgICAgICAgIHFlbXVfZmNsb3NlKGZpbGUpOworICAgIH0KKyAgICBzLT5maWxlID0gcWVtdV9mb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYgKHMtPmZpbGUpIHsKKyAgICAgICAgLyogV3JpdGUgYmFjayBjb250ZW50cywgYXMgJ3diJyBtb2RlIGNsZWFuZWQgdGhlIGZpbGUgKi8KKyAgICAgICAgcWVtdV9wdXRfYnVmZmVyKHMtPmZpbGUsIHMtPmNvbnRlbnRzLCBzLT5jaGlwX3NpemUpOworICAgICAgICBxZW11X2ZmbHVzaChzLT5maWxlKTsKKyAgICB9CiAKICAgICAvKiBSZWFkL3dyaXRlIG1lbW9yeSAqLwotICAgIG1lbV9pbmRleDEgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KDAsIG52cmFtX3JlYWQsIG52cmFtX3dyaXRlLCBzKTsKLSAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KG1lbV9iYXNlLCBzLT5jYXBhY2l0eSwgbWVtX2luZGV4MSk7Ci0gICAgLyogUmVhZC1vbmx5IG1lbW9yeSAqLwotICAgIG1lbV9pbmRleDIgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KDAsIG52cmFtX3JlYWQsIG52cmFtX25vbmUsIHMpOwotICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkobWVtX2Jhc2UgKyBzLT5jYXBhY2l0eSwgcy0+Y2FwYWNpdHksIG1lbV9pbmRleDIpOworICAgIG1lbV9pbmRleFJXID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeSgwLCBudnJhbV9yZWFkLCBudnJhbV93cml0ZSwgcyk7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShtZW1fYmFzZSwgcy0+Y2hpcF9zaXplLCBtZW1faW5kZXhSVyk7CisgICAgLyogUmVhZC93cml0ZSBwcm90ZWN0ZWQgbWVtb3J5ICovCisgICAgbWVtX2luZGV4UlAgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KDAsIG52cmFtX3JlYWQsIG52cmFtX3dyaXRlX3Byb3RlY3RlZCwgcyk7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShtZW1fYmFzZSArIHMtPmNoaXBfc2l6ZSwgcy0+Y2hpcF9zaXplLCBtZW1faW5kZXhSUCk7CiAgICAgcmV0dXJuIHM7CiB9CmRpZmYgLS1naXQgYS9ody9taXBzLmggYi9ody9taXBzLmgKaW5kZXggMDE5NmI2Yy4uZjQ1OTlhNCAxMDA2NDQKLS0tIGEvaHcvbWlwcy5oCisrKyBiL2h3L21pcHMuaApAQCAtNiw4ICs2LDggQEAKIFBDSUJ1cyAqcGNpX2d0NjQxMjBfaW5pdChxZW11X2lycSAqcGljKTsKIAogLyogZHMxMjI1eS5jICovCi10eXBlZGVmIHN0cnVjdCBkczEyMjV5X3QgZHMxMjI1eV90OwotZHMxMjI1eV90ICpkczEyMjV5X2luaXQodGFyZ2V0X3BoeXNfYWRkcl90IG1lbV9iYXNlLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7Cit2b2lkICpkczEyMjV5X2luaXQodGFyZ2V0X3BoeXNfYWRkcl90IG1lbV9iYXNlLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7Cit2b2lkIGRzMTIyNXlfc2V0X3Byb3RlY3Rpb24odm9pZCAqb3BhcXVlLCBpbnQgcHJvdGVjdGlvbik7CiAKIC8qIG1pcHNuZXQuYyAqLwogdm9pZCBtaXBzbmV0X2luaXQoaW50IGJhc2UsIHFlbXVfaXJxIGlycSwgTklDSW5mbyAqbmQpOwo=