ZGlmZiAtLWdpdCBhL0hUTUxwYXJzZXIuYyBiL0hUTUxwYXJzZXIuYwppbmRleCAzOGFmNWUzLi4yNGIwZmMwIDEwMDY0NAotLS0gYS9IVE1McGFyc2VyLmMKKysrIGIvSFRNTHBhcnNlci5jCkBAIC0yMTQzLDYgKzIxNDMsNyBAQAogICAgIGN1ci0+cmVmcyA9IE5VTEw7CiAgICAgY3VyLT5fcHJpdmF0ZSA9IE5VTEw7CiAgICAgY3VyLT5jaGFyc2V0ID0gWE1MX0NIQVJfRU5DT0RJTkdfVVRGODsKKyAgICBjdXItPnByb3BlcnRpZXMgPSBYTUxfRE9DX0hUTUwgfCBYTUxfRE9DX1VTRVJCVUlMVDsKICAgICBpZiAoKEV4dGVybmFsSUQgIT0gTlVMTCkgfHwKIAkoVVJJICE9IE5VTEwpKQogCXhtbENyZWF0ZUludFN1YnNldChjdXIsIEJBRF9DQVNUICJodG1sIiwgRXh0ZXJuYWxJRCwgVVJJKTsKQEAgLTI3NjcsNiArMjc2OCw3IEBACiAgICAgeG1sQ2hhciBidWZbSFRNTF9QQVJTRVJfQklHX0JVRkZFUl9TSVpFICsgNV07CiAgICAgaW50IG5iY2hhciA9IDA7CiAgICAgaW50IGN1ciwgbDsKKyAgICBpbnQgY2h1bmsgPSAwOwogCiAgICAgU0hSSU5LOwogICAgIGN1ciA9IENVUl9DSEFSKGwpOwpAQCAtMjc5Nyw2ICsyNzk5LDEyIEBACiAJICAgIG5iY2hhciA9IDA7CiAJfQogCU5FWFRMKGwpOworICAgICAgICBjaHVuaysrOworICAgICAgICBpZiAoY2h1bmsgPiBIVE1MX1BBUlNFUl9CVUZGRVJfU0laRSkgeworICAgICAgICAgICAgY2h1bmsgPSAwOworICAgICAgICAgICAgU0hSSU5LOworICAgICAgICAgICAgR1JPVzsKKyAgICAgICAgfQogCWN1ciA9IENVUl9DSEFSKGwpOwogCWlmIChjdXIgPT0gMCkgewogCSAgICBTSFJJTks7CkBAIC0zMTE1LDkgKzMxMjMsOSBAQAogCSAgICAgICAgdmFsID0gdmFsICogMTYgKyAoQ1VSIC0gJ0EnKSArIDEwOwogCSAgICBlbHNlIHsKIAkgICAgICAgIGh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0lOVkFMSURfSEVYX0NIQVJSRUYsCi0JCSAgICAgICAgICAgICAiaHRtbFBhcnNlQ2hhclJlZjogaW52YWxpZCBoZXhhZGVjaW1hbCB2YWx1ZVxuIiwKKwkJICAgICAgICAgICAgICJodG1sUGFyc2VDaGFyUmVmOiBtaXNzaW5nIHNlbWljb2x1bW5cbiIsCiAJCQkgICAgIE5VTEwsIE5VTEwpOwotCQlyZXR1cm4oMCk7CisJCWJyZWFrOwogCSAgICB9CiAJICAgIE5FWFQ7CiAJfQpAQCAtMzEzMCw5ICszMTM4LDkgQEAKIAkgICAgICAgIHZhbCA9IHZhbCAqIDEwICsgKENVUiAtICcwJyk7CiAJICAgIGVsc2UgewogCSAgICAgICAgaHRtbFBhcnNlRXJyKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9ERUNfQ0hBUlJFRiwKLQkJICAgICAgICAgICAgICJodG1sUGFyc2VDaGFyUmVmOiBpbnZhbGlkIGRlY2ltYWwgdmFsdWVcbiIsCisJCSAgICAgICAgICAgICAiaHRtbFBhcnNlQ2hhclJlZjogbWlzc2luZyBzZW1pY29sdW1uXG4iLAogCQkJICAgICBOVUxMLCBOVUxMKTsKLQkJcmV0dXJuKDApOworCQlicmVhazsKIAkgICAgfQogCSAgICBORVhUOwogCX0KQEAgLTM0MjMsNyArMzQzMSw3IEBACiAgKgogICogW05TIDEwXSBFbXB0eUVsZW1lbnQgOjo9ICc8JyBRTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnLz4nCiAgKgotICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgZXJyb3IgYW5kIDEgaWYgZGlzY2FyZGVkCiAgKi8KIAogc3RhdGljIGludApAQCAtMzQzNiw2ICszNDQ0LDcgQEAKICAgICBpbnQgbWF4YXR0czsKICAgICBpbnQgbWV0YSA9IDA7CiAgICAgaW50IGk7CisgICAgaW50IGRpc2NhcmR0YWcgPSAwOwogCiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5pbnB1dCA9PSBOVUxMKSkgewogCWh0bWxQYXJzZUVycihjdHh0LCBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLApAQCAtMzQ4MCwxNCArMzQ4OSwxNiBAQAogCWh0bWxQYXJzZUVycihjdHh0LCBYTUxfSFRNTF9TVFJVQ1VSRV9FUlJPUiwKIAkgICAgICAgICAgICAgImh0bWxQYXJzZVN0YXJ0VGFnOiBtaXNwbGFjZWQgPGh0bWw+IHRhZ1xuIiwKIAkJICAgICBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gMDsKKwlkaXNjYXJkdGFnID0gMTsKKwljdHh0LT5kZXB0aCsrOwogICAgIH0KICAgICBpZiAoKGN0eHQtPm5hbWVOciAhPSAxKSAmJiAKIAkoeG1sU3RyRXF1YWwobmFtZSwgQkFEX0NBU1QiaGVhZCIpKSkgewogCWh0bWxQYXJzZUVycihjdHh0LCBYTUxfSFRNTF9TVFJVQ1VSRV9FUlJPUiwKIAkgICAgICAgICAgICAgImh0bWxQYXJzZVN0YXJ0VGFnOiBtaXNwbGFjZWQgPGhlYWQ+IHRhZ1xuIiwKIAkJICAgICBuYW1lLCBOVUxMKTsKLQlyZXR1cm4gMDsKKwlkaXNjYXJkdGFnID0gMTsKKwljdHh0LT5kZXB0aCsrOwogICAgIH0KICAgICBpZiAoeG1sU3RyRXF1YWwobmFtZSwgQkFEX0NBU1QiYm9keSIpKSB7CiAJaW50IGluZHg7CkBAIC0zNDk2LDkgKzM1MDcsOCBAQAogCQlodG1sUGFyc2VFcnIoY3R4dCwgWE1MX0hUTUxfU1RSVUNVUkVfRVJST1IsCiAJCSAgICAgICAgICAgICAiaHRtbFBhcnNlU3RhcnRUYWc6IG1pc3BsYWNlZCA8Ym9keT4gdGFnXG4iLAogCQkJICAgICBuYW1lLCBOVUxMKTsKLQkJd2hpbGUgKChJU19DSEFSX0NIKENVUikpICYmIChDVVIgIT0gJz4nKSkKLQkJICAgIE5FWFQ7Ci0JCXJldHVybiAwOworCQlkaXNjYXJkdGFnID0gMTsKKwkJY3R4dC0+ZGVwdGgrKzsKIAkgICAgfQogCX0KICAgICB9CkBAIC0zNTk3LDEyICszNjA3LDE0IEBACiAgICAgLyoKICAgICAgKiBTQVg6IFN0YXJ0IG9mIEVsZW1lbnQgIQogICAgICAqLwotICAgIGh0bWxuYW1lUHVzaChjdHh0LCBuYW1lKTsKLSAgICBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5zdGFydEVsZW1lbnQgIT0gTlVMTCkpIHsKLQlpZiAobmJhdHRzICE9IDApCi0gICAgICAgICAgICBjdHh0LT5zYXgtPnN0YXJ0RWxlbWVudChjdHh0LT51c2VyRGF0YSwgbmFtZSwgYXR0cyk7Ci0JZWxzZQotICAgICAgICAgICAgY3R4dC0+c2F4LT5zdGFydEVsZW1lbnQoY3R4dC0+dXNlckRhdGEsIG5hbWUsIE5VTEwpOworICAgIGlmICghZGlzY2FyZHRhZykgeworCWh0bWxuYW1lUHVzaChjdHh0LCBuYW1lKTsKKwlpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5zdGFydEVsZW1lbnQgIT0gTlVMTCkpIHsKKwkgICAgaWYgKG5iYXR0cyAhPSAwKQorCQljdHh0LT5zYXgtPnN0YXJ0RWxlbWVudChjdHh0LT51c2VyRGF0YSwgbmFtZSwgYXR0cyk7CisJICAgIGVsc2UKKwkJY3R4dC0+c2F4LT5zdGFydEVsZW1lbnQoY3R4dC0+dXNlckRhdGEsIG5hbWUsIE5VTEwpOworCX0KICAgICB9CiAKICAgICBpZiAoYXR0cyAhPSBOVUxMKSB7CkBAIC0zNjEyLDcgKzM2MjQsNyBAQAogCX0KICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4oZGlzY2FyZHRhZyk7CiB9CiAKIC8qKgpAQCAtMzY0Nyw3ICszNjU5LDYgQEAKICAgICBuYW1lID0gaHRtbFBhcnNlSFRNTE5hbWUoY3R4dCk7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuICgwKTsKLQogICAgIC8qCiAgICAgICogV2Ugc2hvdWxkIGRlZmluaXRlbHkgYmUgYXQgdGhlIGVuZGluZyAiUz8gJz4nIiBwYXJ0CiAgICAgICovCkBAIC0zNjY4LDYgKzM2NzksMTggQEAKICAgICAgICAgTkVYVDsKIAogICAgIC8qCisgICAgICogaWYgd2UgaWdub3JlZCBtaXNwbGFjZWQgdGFncyBpbiBodG1sUGFyc2VTdGFydFRhZyBkb24ndCBwb3AgdGhlbQorICAgICAqIG91dCBub3cuCisgICAgICovCisgICAgaWYgKChjdHh0LT5kZXB0aCA+IDApICYmCisgICAgICAgICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAiaHRtbCIpIHx8CisgICAgICAgICB4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAiYm9keSIpIHx8CisJIHhtbFN0ckVxdWFsKG5hbWUsIEJBRF9DQVNUICJoZWFkIikpKSB7CisJY3R4dC0+ZGVwdGgtLTsKKwlyZXR1cm4gKDApOworICAgIH0KKworICAgIC8qCiAgICAgICogSWYgdGhlIG5hbWUgcmVhZCBpcyBub3Qgb25lIG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYXJzaW5nIHN0YWNrCiAgICAgICogdGhlbiByZXR1cm4sIGl0J3MganVzdCBhbiBlcnJvci4KICAgICAgKi8KQEAgLTM5OTEsNyArNDAxNCw3IEBACiAKICAgICBmYWlsZWQgPSBodG1sUGFyc2VTdGFydFRhZyhjdHh0KTsKICAgICBuYW1lID0gY3R4dC0+bmFtZTsKLSAgICBpZiAoZmFpbGVkIHx8IChuYW1lID09IE5VTEwpKSB7CisgICAgaWYgKChmYWlsZWQgPT0gLTEpIHx8IChuYW1lID09IE5VTEwpKSB7CiAJaWYgKENVUiA9PSAnPicpCiAJICAgIE5FWFQ7CiAgICAgICAgIHJldHVybjsKQEAgLTQwOTcsNiArNDEyMCw4IEBACiAKIGludAogaHRtbFBhcnNlRG9jdW1lbnQoaHRtbFBhcnNlckN0eHRQdHIgY3R4dCkgeworICAgIHhtbENoYXIgc3RhcnRbNF07CisgICAgeG1sQ2hhckVuY29kaW5nIGVuYzsKICAgICB4bWxEdGRQdHIgZHRkOwogCiAgICAgeG1sSW5pdFBhcnNlcigpOwpAQCAtNDExNiw2ICs0MTQxLDIzIEBACiAgICAgaWYgKChjdHh0LT5zYXgpICYmIChjdHh0LT5zYXgtPnNldERvY3VtZW50TG9jYXRvcikpCiAgICAgICAgIGN0eHQtPnNheC0+c2V0RG9jdW1lbnRMb2NhdG9yKGN0eHQtPnVzZXJEYXRhLCAmeG1sRGVmYXVsdFNBWExvY2F0b3IpOwogCisgICAgaWYgKChjdHh0LT5lbmNvZGluZyA9PSAoY29uc3QgeG1sQ2hhciAqKVhNTF9DSEFSX0VOQ09ESU5HX05PTkUpICYmCisgICAgICAgICgoY3R4dC0+aW5wdXQtPmVuZCAtIGN0eHQtPmlucHV0LT5jdXIpID49IDQpKSB7CisJLyoKKwkgKiBHZXQgdGhlIDQgZmlyc3QgYnl0ZXMgYW5kIGRlY29kZSB0aGUgY2hhcnNldAorCSAqIGlmIGVuYyAhPSBYTUxfQ0hBUl9FTkNPRElOR19OT05FCisJICogcGx1ZyBzb21lIGVuY29kaW5nIGNvbnZlcnNpb24gcm91dGluZXMuCisJICovCisJc3RhcnRbMF0gPSBSQVc7CisJc3RhcnRbMV0gPSBOWFQoMSk7CisJc3RhcnRbMl0gPSBOWFQoMik7CisJc3RhcnRbM10gPSBOWFQoMyk7CisJZW5jID0geG1sRGV0ZWN0Q2hhckVuY29kaW5nKCZzdGFydFswXSwgNCk7CisJaWYgKGVuYyAhPSBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSB7CisJICAgIHhtbFN3aXRjaEVuY29kaW5nKGN0eHQsIGVuYyk7CisJfQorICAgIH0KKwogICAgIC8qCiAgICAgICogV2lwZSBvdXQgZXZlcnl0aGluZyB3aGljaCBpcyBiZWZvcmUgdGhlIGZpcnN0ICc8JwogICAgICAqLwpAQCAtNDEzNSwxMCArNDE3NywxMCBAQAogICAgIHdoaWxlICgoKENVUiA9PSAnPCcpICYmIChOWFQoMSkgPT0gJyEnKSAmJgogICAgICAgICAgICAgKE5YVCgyKSA9PSAnLScpICYmIChOWFQoMykgPT0gJy0nKSkgfHwKIAkgICAoKENVUiA9PSAnPCcpICYmIChOWFQoMSkgPT0gJz8nKSkpIHsKLSAgICAgICAgaHRtbFBhcnNlQ29tbWVudChjdHh0KTsJICAgCi0gICAgICAgIGh0bWxQYXJzZVBJKGN0eHQpOwkgICAKKyAgICAgICAgaHRtbFBhcnNlQ29tbWVudChjdHh0KTsKKyAgICAgICAgaHRtbFBhcnNlUEkoY3R4dCk7CiAJU0tJUF9CTEFOS1M7Ci0gICAgfQkgICAKKyAgICB9CiAKIAogICAgIC8qCkBAIC00ODkzLDcgKzQ5MzUsNyBAQAogCiAJCWZhaWxlZCA9IGh0bWxQYXJzZVN0YXJ0VGFnKGN0eHQpOwogCQluYW1lID0gY3R4dC0+bmFtZTsKLQkJaWYgKGZhaWxlZCB8fAorCQlpZiAoKGZhaWxlZCA9PSAtMSkgfHwKIAkJICAgIChuYW1lID09IE5VTEwpKSB7CiAJCSAgICBpZiAoQ1VSID09ICc+JykKIAkJCU5FWFQ7CkBAIC01OTU3LDggKzU5OTksMTIgQEAKICAgICAgICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoZGxyOwogCiAJaGRsciA9IHhtbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKGVuY29kaW5nKTsKLQlpZiAoaGRsciAhPSBOVUxMKQorCWlmIChoZGxyICE9IE5VTEwpIHsKIAkgICAgeG1sU3dpdGNoVG9FbmNvZGluZyhjdHh0LCBoZGxyKTsKKwkgICAgaWYgKGN0eHQtPmlucHV0LT5lbmNvZGluZyAhPSBOVUxMKQorCSAgICAgIHhtbEZyZWUoKHhtbENoYXIgKikgY3R4dC0+aW5wdXQtPmVuY29kaW5nKTsKKyAgICAgICAgICAgIGN0eHQtPmlucHV0LT5lbmNvZGluZyA9IHhtbFN0cmR1cCgoeG1sQ2hhciAqKWVuY29kaW5nKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAoKFVSTCAhPSBOVUxMKSAmJiAoY3R4dC0+aW5wdXQgIT0gTlVMTCkgJiYKICAgICAgICAgKGN0eHQtPmlucHV0LT5maWxlbmFtZSA9PSBOVUxMKSkKZGlmZiAtLWdpdCBhL0hUTUx0cmVlLmMgYi9IVE1MdHJlZS5jCmluZGV4IGU3OWQxMTguLjM3OTk5ZjcgMTAwNjQ0Ci0tLSBhL0hUTUx0cmVlLmMKKysrIGIvSFRNTHRyZWUuYwpAQCAtMzE2LDYgKzMxNiwxMSBAQAogfQogCiAjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisvKgorICogcHJpdmF0ZSByb3V0aW5lIGV4cG9ydGVkIGZyb20geG1sSU8uYworICovCit4bWxPdXRwdXRCdWZmZXJQdHIKK3htbEFsbG9jT3V0cHV0QnVmZmVySW50ZXJuYWwoeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBlbmNvZGVyKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgogICogCQkJT3V0cHV0IGVycm9yIGhhbmRsZXJzCQkJCSoKQEAgLTU2Niw3ICs1NzEsNyBAQAogICAgIGlmIChoYW5kbGVyID09IE5VTEwpCiAJaGFuZGxlciA9IHhtbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKCJhc2NpaSIpOwogCi0gICAgYnVmID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoaGFuZGxlcik7CisgICAgYnVmID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChoYW5kbGVyKTsKICAgICBpZiAoYnVmID09IE5VTEwpIHsKIAkqbWVtID0gTlVMTDsKIAkqc2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9TQVgyLmMgYi9TQVgyLmMKaW5kZXggOTczOTgzMS4uMTY0NDA5YyAxMDA2NDQKLS0tIGEvU0FYMi5jCisrKyBiL1NBWDIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgImxpYnhtbC5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KICNpbmNsdWRlIDxsaWJ4bWwvdHJlZS5oPgogI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KQEAgLTI2LDYgKzI3LDExIEBACiAjaW5jbHVkZSA8bGlieG1sL0hUTUx0cmVlLmg+CiAjaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KIAorLyogRGVmaW5lIFNJWkVfVF9NQVggdW5sZXNzIGRlZmluZWQgdGhyb3VnaCA8bGltaXRzLmg+LiAqLworI2lmbmRlZiBTSVpFX1RfTUFYCisjIGRlZmluZSBTSVpFX1RfTUFYICAgICAoKHNpemVfdCktMSkKKyNlbmRpZiAvKiAhU0laRV9UX01BWCAqLworCiAvKiAjZGVmaW5lIERFQlVHX1NBWDIgKi8KIC8qICNkZWZpbmUgREVCVUdfU0FYMl9UUkVFICovCiAKQEAgLTU4MCw3ICs1ODYsOCBAQAogCSAgICByZXR1cm4oTlVMTCk7CiAJfQogCXJldC0+b3duZXIgPSAxOwotCXJldC0+Y2hlY2tlZCA9IDE7CisJaWYgKHJldC0+Y2hlY2tlZCA9PSAwKQorCSAgICByZXQtPmNoZWNrZWQgPSAxOwogICAgIH0KICAgICByZXR1cm4ocmV0KTsKIH0KQEAgLTk1Nyw2ICs5NjQsOCBAQAogI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKIAlpZiAoY3R4dC0+bXlEb2MgPT0gTlVMTCkKIAkgICAgY3R4dC0+bXlEb2MgPSBodG1sTmV3RG9jTm9EdEQoTlVMTCwgTlVMTCk7CisJY3R4dC0+bXlEb2MtPnByb3BlcnRpZXMgPSBYTUxfRE9DX0hUTUw7CisJY3R4dC0+bXlEb2MtPnBhcnNlRmxhZ3MgPSBjdHh0LT5vcHRpb25zOwogCWlmIChjdHh0LT5teURvYyA9PSBOVUxMKSB7CiAJICAgIHhtbFNBWDJFcnJNZW1vcnkoY3R4dCwgInhtbFNBWDJTdGFydERvY3VtZW50Iik7CiAJICAgIHJldHVybjsKQEAgLTk3Miw2ICs5ODEsMTAgQEAKICAgICB9IGVsc2UgewogCWRvYyA9IGN0eHQtPm15RG9jID0geG1sTmV3RG9jKGN0eHQtPnZlcnNpb24pOwogCWlmIChkb2MgIT0gTlVMTCkgeworCSAgICBkb2MtPnByb3BlcnRpZXMgPSAwOworCSAgICBpZiAoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9PTEQxMCkKKwkgICAgICAgIGRvYy0+cHJvcGVydGllcyB8PSBYTUxfRE9DX09MRDEwOworCSAgICBkb2MtPnBhcnNlRmxhZ3MgPSBjdHh0LT5vcHRpb25zOwogCSAgICBpZiAoY3R4dC0+ZW5jb2RpbmcgIT0gTlVMTCkKIAkJZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChjdHh0LT5lbmNvZGluZyk7CiAJICAgIGVsc2UKQEAgLTE4MzcsNiArMTg1MCw5IEBACiAgICAgfSBlbHNlCiAJcmV0LT5jb250ZW50ID0gKHhtbENoYXIgKikgaW50ZXJuOwogCisgICAgaWYgKGN0eHQtPmlucHV0ICE9IE5VTEwpCisgICAgICAgIHJldC0+bGluZSA9IGN0eHQtPmlucHV0LT5saW5lOworCiAgICAgaWYgKChfX3htbFJlZ2lzdGVyQ2FsbGJhY2tzKSAmJiAoeG1sUmVnaXN0ZXJOb2RlRGVmYXVsdFZhbHVlKSkKIAl4bWxSZWdpc3Rlck5vZGVEZWZhdWx0VmFsdWUocmV0KTsKICAgICByZXR1cm4ocmV0KTsKQEAgLTIzNjYsNyArMjM4Miw5IEBACiAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICJhZGQgeG1sU0FYMlJlZmVyZW5jZSAlcyB0byAlcyBcbiIsIG5hbWUsIGN0eHQtPm5vZGUtPm5hbWUpOwogI2VuZGlmCi0gICAgeG1sQWRkQ2hpbGQoY3R4dC0+bm9kZSwgcmV0KTsKKyAgICBpZiAoeG1sQWRkQ2hpbGQoY3R4dC0+bm9kZSwgcmV0KSA9PSBOVUxMKSB7CisgICAgICAgIHhtbEZyZWVOb2RlKHJldCk7CisgICAgfQogfQogCiAvKioKQEAgLTI0NDMsOSArMjQ2MSwxOSBAQAogCSAgICAgICAgICAgICAgICh4bWxEaWN0T3ducyhjdHh0LT5kaWN0LCBsYXN0Q2hpbGQtPmNvbnRlbnQpKSkgewogCQlsYXN0Q2hpbGQtPmNvbnRlbnQgPSB4bWxTdHJkdXAobGFzdENoaWxkLT5jb250ZW50KTsKIAkgICAgfQorICAgICAgICAgICAgaWYgKCgoc2l6ZV90KWN0eHQtPm5vZGVsZW4gKyAoc2l6ZV90KWxlbiA+IFhNTF9NQVhfVEVYVF9MRU5HVEgpICYmCisgICAgICAgICAgICAgICAgKChjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX0hVR0UpID09IDApKSB7CisgICAgICAgICAgICAgICAgeG1sU0FYMkVyck1lbW9yeShjdHh0LCAieG1sU0FYMkNoYXJhY3RlcnM6IGh1Z2UgdGV4dCBub2RlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICBpZiAoKHNpemVfdCljdHh0LT5ub2RlbGVuID4gU0laRV9UX01BWCAtIChzaXplX3QpbGVuIHx8IAorCSAgICAgICAgKHNpemVfdCljdHh0LT5ub2RlbWVtICsgKHNpemVfdClsZW4gPiBTSVpFX1RfTUFYIC8gMikgeworICAgICAgICAgICAgICAgIHhtbFNBWDJFcnJNZW1vcnkoY3R4dCwgInhtbFNBWDJDaGFyYWN0ZXJzIG92ZXJmbG93IHByZXZlbnRlZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKwkgICAgfQogCSAgICBpZiAoY3R4dC0+bm9kZWxlbiArIGxlbiA+PSBjdHh0LT5ub2RlbWVtKSB7CiAJCXhtbENoYXIgKm5ld2J1ZjsKLQkJaW50IHNpemU7CisJCXNpemVfdCBzaXplOwogCiAJCXNpemUgPSBjdHh0LT5ub2RlbWVtICsgbGVuOwogCQlzaXplICo9IDI7CmRpZmYgLS1naXQgYS9jYXRhbG9nLmMgYi9jYXRhbG9nLmMKaW5kZXggZWUzZjhmMi4uYWY4NGI3YyAxMDA2NDQKLS0tIGEvY2F0YWxvZy5jCisrKyBiL2NhdGFsb2cuYwpAQCAtMjYxNiw2ICsyNjE2LDggQEAKIAlyZXR1cm4ocmV0KTsKICAgICBpZiAoc3lzSUQgIT0gTlVMTCkKIAlyZXQgPSB4bWxDYXRhbG9nR2V0U0dNTFN5c3RlbShjYXRhbC0+c2dtbCwgc3lzSUQpOworICAgIGlmIChyZXQgIT0gTlVMTCkKKwlyZXR1cm4ocmV0KTsKICAgICByZXR1cm4oTlVMTCk7CiB9CiAKQEAgLTI5MTIsNyArMjkxNCw3IEBACiAKIAlzZ21sID0geG1sQ2F0YWxvZ1NHTUxSZXNvbHZlKGNhdGFsLCBOVUxMLCBVUkkpOwogCWlmIChzZ21sICE9IE5VTEwpCi0gICAgICAgICAgICBzZ21sID0geG1sU3RyZHVwKHNnbWwpOworICAgICAgICAgICAgcmV0ID0geG1sU3RyZHVwKHNnbWwpOwogICAgIH0KICAgICByZXR1cm4ocmV0KTsKIH0KZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKaW5kZXggMTg0OGVmMC4uYWY4NDlhZSAxMDA2NDQKLS0tIGEvY29uZmlnLmgKKysrIGIvY29uZmlnLmgKQEAgLTEsMyArMSw3IEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKyNkZWZpbmUgUEFDS0FHRSAibGlieG1sMiIKKyNkZWZpbmUgVkVSU0lPTiAiMi43LjMiCiAvKiAjdW5kZWYgSEFWRV9MSUJaICovCiAvKiAjdW5kZWYgSEFWRV9MSUJNICovCiAjZGVmaW5lIEhBVkVfSVNJTkYgCkBAIC03MSw3ICs3NSw3IEBACiAjZGVmaW5lIEhBVkVfRlRJTUUgMQogCiAvKiBEZWZpbmUgaWYgZ2V0YWRkcmluZm8gaXMgdGhlcmUgKi8KLS8qICN1bmRlZiBIQVZFX0dFVEFERFJJTkZPICovCisvKiAjdW5kZWYgSEFWRV9HRVRBRERSSU5GTyAgKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLwogI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCkBAIC04Miw2ICs4Niw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmguaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9JTlRUWVBFU19IX0ggKi8KKwogLyogRGVmaW5lIGlmIGlzaW5mIGlzIHRoZXJlICovCiAjZGVmaW5lIEhBVkVfSVNJTkYgCiAKQEAgLTEwMSw3ICsxMDgsNyBAQAogLyogI3VuZGVmIEhBVkVfTElCUkVBRExJTkUgKi8KIAogLyogSGF2ZSBjb21wcmVzc2lvbiBsaWJyYXJ5ICovCi0vLyNkZWZpbmUgSEFWRV9MSUJaIDEKKy8qICN1bmRlZiBIQVZFX0xJQlogKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfTElNSVRTX0ggMQpAQCAtMTA5LDYgKzExNiw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvY2FsdGltZScgZnVuY3Rpb24uICovCiAjZGVmaW5lIEhBVkVfTE9DQUxUSU1FIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9NQUxMT0NfSCAxIEFscmVhZHkgZGVmaW5lZCBpbiBBbmRyb2lkQ29uZmlnLmggKi8KKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYXRoLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX01BVEhfSCAxCiAKQEAgLTIzMiwxMCArMjQyLDYxIEBACiAjZGVmaW5lIEhBVkVfVlNQUklOVEYgMQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHpsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0vLyNkZWZpbmUgSEFWRV9aTElCX0ggMQorLyogI3VuZGVmIEhBVkVfWkxJQl9IICovCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3N0YXQnIGZ1bmN0aW9uLiAqLwogLyogI3VuZGVmIEhBVkVfX1NUQVQgKi8KIAogLyogV2hldGhlciBfX3ZhX2NvcHkoKSBpcyBhdmFpbGFibGUgKi8KIC8qICN1bmRlZiBIQVZFX19fVkFfQ09QWSAqLworCisvKiBEZWZpbmUgYXMgY29uc3QgaWYgdGhlIGRlY2xhcmF0aW9uIG9mIGljb252KCkgbmVlZHMgY29uc3QuICovCisvKiAjdW5kZWYgSUNPTlZfQ09OU1QgKi8KKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgImxpYnhtbDIiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiIgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBQUk9UT1RZUEVTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFN1cHBvcnQgZm9yIElQdjYgKi8KKy8qICN1bmRlZiBTVVBQT1JUX0lQNiAqLworCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjZGVmaW5lIFZFUlNJT04gIjIuNy4zIgorCisvKiBEZXRlcm1pbmUgd2hhdCBzb2NrZXQgbGVuZ3RoIChzb2NrbGVuX3QpIGRhdGEgdHlwZSBpcyAqLworI2RlZmluZSBYTUxfU09DS0xFTl9UIHNvY2tsZW5fdAorCisvKiBVc2luZyB0aGUgV2luMzIgU29ja2V0IGltcGxlbWVudGF0aW9uICovCisvKiAjdW5kZWYgX1dJTlNPQ0tBUElfICovCisKKy8qIERlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuICovCisjZGVmaW5lIF9fUFJPVE9UWVBFUyAxCisKKy8qIFdpbjMyIFN0ZCBDIG5hbWUgbWFuZ2xpbmcgd29yay1hcm91bmQgKi8KKy8qICN1bmRlZiBzbnByaW50ZiAqLworCisvKiBzc19mYW1pbHkgaXMgbm90IGRlZmluZWQgaGVyZSwgdXNlIF9fc3NfZmFtaWx5IGluc3RlYWQgKi8KKy8qICN1bmRlZiBzc19mYW1pbHkgKi8KKworLyogV2luMzIgU3RkIEMgbmFtZSBtYW5nbGluZyB3b3JrLWFyb3VuZCAqLworLyogI3VuZGVmIHZzbnByaW50ZiAqLwpkaWZmIC0tZ2l0IGEvZGVidWdYTUwuYyBiL2RlYnVnWE1MLmMKaW5kZXggMzk4NWFkMy4uZGU2ZmQ2YyAxMDA2NDQKLS0tIGEvZGVidWdYTUwuYworKysgYi9kZWJ1Z1hNTC5jCkBAIC0zMjAsNyArMzIwLDggQEAKICAgICB9CiAgICAgaWYgKG5vZGUtPm5leHQgPT0gTlVMTCkgewogCWlmICgobm9kZS0+cGFyZW50ICE9IE5VTEwpICYmIChub2RlLT50eXBlICE9IFhNTF9BVFRSSUJVVEVfTk9ERSkgJiYKLQkgICAgKG5vZGUtPnBhcmVudC0+bGFzdCAhPSBub2RlKSkKKwkgICAgKG5vZGUtPnBhcmVudC0+bGFzdCAhPSBub2RlKSAmJgorCSAgICAobm9kZS0+cGFyZW50LT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpKQogCSAgICB4bWxEZWJ1Z0VycihjdHh0LCBYTUxfQ0hFQ0tfTk9fTkVYVCwKICAgICAgICAgICAgICAgICAgICAgIk5vZGUgaGFzIG5vIG5leHQgYW5kIG5vdCBsYXN0IG9mIHBhcmVudCBsaXN0XG4iKTsKICAgICB9IGVsc2UgewpAQCAtMzI0NCw2ICszMjQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBjb21tYW5kICVzXG4iLCBjb21tYW5kKTsKICAgICAgICAgfQogICAgICAgICBmcmVlKGNtZGxpbmUpOyAgICAgICAgICAvKiBub3QgeG1sRnJlZSBoZXJlICEgKi8KKwljbWRsaW5lID0gTlVMTDsKICAgICB9CiAjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKICAgICB4bWxYUGF0aEZyZWVDb250ZXh0KGN0eHQtPnBjdHh0KTsKZGlmZiAtLWdpdCBhL2RpY3QuYyBiL2RpY3QuYwppbmRleCAzYjQwNTRmLi4wZTA3ZThkIDEwMDY0NAotLS0gYS9kaWN0LmMKKysrIGIvZGljdC5jCkBAIC0yMCwxOCArMjAsNDggQEAKICNpbmNsdWRlICJsaWJ4bWwuaCIKIAogI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoV0lOMzIpCit0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgdWludDMyX3Q7CisjZW5kaWYKKyNlbmRpZgogI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiAjaW5jbHVkZSA8bGlieG1sL2RpY3QuaD4KICNpbmNsdWRlIDxsaWJ4bWwveG1sbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGlieG1sL3htbGVycm9yLmg+CiAjaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KIAotI2RlZmluZSBNQVhfSEFTSF9MRU4gNAorLyogI2RlZmluZSBERUJVR19HUk9XICovCisvKiAjZGVmaW5lIERJQ1RfREVCVUdfUEFUVEVSTlMgKi8KKworI2RlZmluZSBNQVhfSEFTSF9MRU4gMwogI2RlZmluZSBNSU5fRElDVF9TSVpFIDEyOAogI2RlZmluZSBNQVhfRElDVF9IQVNIIDggKiAyMDQ4CisjZGVmaW5lIFdJVEhfQklHX0tFWQogCi0vKiAjZGVmaW5lIEFMTE9XX1JFTU9WQUwgKi8KLS8qICNkZWZpbmUgREVCVUdfR1JPVyAqLworI2lmZGVmIFdJVEhfQklHX0tFWQorI2RlZmluZSB4bWxEaWN0Q29tcHV0ZUtleShkaWN0LCBuYW1lLCBsZW4pCQkJXAorICAgICgoKGRpY3QpLT5zaXplID09IE1JTl9ESUNUX1NJWkUpID8JCQkJXAorICAgICB4bWxEaWN0Q29tcHV0ZUZhc3RLZXkobmFtZSwgbGVuKSA6CQkJCVwKKyAgICAgeG1sRGljdENvbXB1dGVCaWdLZXkobmFtZSwgbGVuKSkKKworI2RlZmluZSB4bWxEaWN0Q29tcHV0ZVFLZXkoZGljdCwgcHJlZml4LCBwbGVuLCBuYW1lLCBsZW4pCVwKKyAgICAoKChwcmVmaXgpID09IE5VTEwpID8JCQkJCVwKKyAgICAgICh4bWxEaWN0Q29tcHV0ZUtleShkaWN0LCBuYW1lLCBsZW4pKSA6CQkJXAorICAgICAgKCgoZGljdCktPnNpemUgPT0gTUlOX0RJQ1RfU0laRSkgPwkJCVwKKyAgICAgICB4bWxEaWN0Q29tcHV0ZUZhc3RRS2V5KHByZWZpeCwgcGxlbiwgbmFtZSwgbGVuKSA6CVwKKyAgICAgICB4bWxEaWN0Q29tcHV0ZUJpZ1FLZXkocHJlZml4LCBwbGVuLCBuYW1lLCBsZW4pKSkKKworI2Vsc2UgLyogIVdJVEhfQklHX0tFWSAqLworI2RlZmluZSB4bWxEaWN0Q29tcHV0ZUtleShkaWN0LCBuYW1lLCBsZW4pCQkJXAorICAgICAgICB4bWxEaWN0Q29tcHV0ZUZhc3RLZXkobmFtZSwgbGVuKQorI2RlZmluZSB4bWxEaWN0Q29tcHV0ZVFLZXkoZGljdCwgcHJlZml4LCBwbGVuLCBuYW1lLCBsZW4pCVwKKyAgICAgICAgeG1sRGljdENvbXB1dGVGYXN0UUtleShwcmVmaXgsIHBsZW4sIG5hbWUsIGxlbikKKyNlbmRpZiAvKiBXSVRIX0JJR19LRVkgKi8KIAogLyoKICAqIEFuIGVudHJ5IGluIHRoZSBkaWN0aW9ubmFyeQpAQCAtNDMsNiArNzMsNyBAQAogICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7CiAgICAgaW50IGxlbjsKICAgICBpbnQgdmFsaWQ7CisgICAgdW5zaWduZWQgbG9uZyBva2V5OwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX3htbERpY3RTdHJpbmdzIHhtbERpY3RTdHJpbmdzOwpAQCAtNjAsNyArOTEsNiBAQAogICovCiBzdHJ1Y3QgX3htbERpY3QgewogICAgIGludCByZWZfY291bnRlcjsKLSAgICB4bWxSTXV0ZXhQdHIgbXV0ZXg7CiAKICAgICBzdHJ1Y3QgX3htbERpY3RFbnRyeSAqZGljdDsKICAgICBpbnQgc2l6ZTsKQEAgLTEzMCw2ICsxNjAsOSBAQAogICAgIGNvbnN0IHhtbENoYXIgKnJldDsKICAgICBpbnQgc2l6ZSA9IDA7IC8qICsgc2l6ZW9mKF94bWxEaWN0U3RyaW5ncykgPT0gMTAyNCAqLwogCisjaWZkZWYgRElDVF9ERUJVR19QQVRURVJOUworICAgIGZwcmludGYoc3RkZXJyLCAiLSIpOworI2VuZGlmCiAgICAgcG9vbCA9IGRpY3QtPnN0cmluZ3M7CiAgICAgd2hpbGUgKHBvb2wgIT0gTlVMTCkgewogCWlmIChwb29sLT5lbmQgLSBwb29sLT5mcmVlID4gbmFtZWxlbikKQEAgLTE1NCwxMiArMTg3LDE2IEBACiAJcG9vbC0+ZW5kID0gJnBvb2wtPmFycmF5W3NpemVdOwogCXBvb2wtPm5leHQgPSBkaWN0LT5zdHJpbmdzOwogCWRpY3QtPnN0cmluZ3MgPSBwb29sOworI2lmZGVmIERJQ1RfREVCVUdfUEFUVEVSTlMKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIrIik7CisjZW5kaWYKICAgICB9CiBmb3VuZF9wb29sOgogICAgIHJldCA9IHBvb2wtPmZyZWU7CiAgICAgbWVtY3B5KHBvb2wtPmZyZWUsIG5hbWUsIG5hbWVsZW4pOwogICAgIHBvb2wtPmZyZWUgKz0gbmFtZWxlbjsKICAgICAqKHBvb2wtPmZyZWUrKykgPSAwOworICAgIHBvb2wtPm5iU3RyaW5ncysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNjcsNiArMjA0LDcgQEAKICAqIHhtbERpY3RBZGRRU3RyaW5nOgogICogQGRpY3Q6IHRoZSBkaWN0aW9ubmFyeQogICogQHByZWZpeDogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEKKyAqIEBwbGVuOiB0aGUgcHJlZml4IGxlbmd0aAogICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YQogICogQGxlbjogdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSwgaWYgLTEgaXQgaXMgcmVjb21wdXRlZAogICoKQEAgLTE3NSwyMCArMjEzLDIxIEBACiAgKiBSZXR1cm5zIHRoZSBwb2ludGVyIG9mIHRoZSBsb2NhbCBzdHJpbmcsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICAqLwogc3RhdGljIGNvbnN0IHhtbENoYXIgKgoteG1sRGljdEFkZFFTdHJpbmcoeG1sRGljdFB0ciBkaWN0LCBjb25zdCB4bWxDaGFyICpwcmVmaXgsCit4bWxEaWN0QWRkUVN0cmluZyh4bWxEaWN0UHRyIGRpY3QsIGNvbnN0IHhtbENoYXIgKnByZWZpeCwgaW50IHBsZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKm5hbWUsIGludCBuYW1lbGVuKQogewogICAgIHhtbERpY3RTdHJpbmdzUHRyIHBvb2w7CiAgICAgY29uc3QgeG1sQ2hhciAqcmV0OwogICAgIGludCBzaXplID0gMDsgLyogKyBzaXplb2YoX3htbERpY3RTdHJpbmdzKSA9PSAxMDI0ICovCi0gICAgaW50IHBsZW47CiAKICAgICBpZiAocHJlZml4ID09IE5VTEwpIHJldHVybih4bWxEaWN0QWRkU3RyaW5nKGRpY3QsIG5hbWUsIG5hbWVsZW4pKTsKLSAgICBwbGVuID0geG1sU3RybGVuKHByZWZpeCk7CiAKKyNpZmRlZiBESUNUX0RFQlVHX1BBVFRFUk5TCisgICAgZnByaW50ZihzdGRlcnIsICI9Iik7CisjZW5kaWYKICAgICBwb29sID0gZGljdC0+c3RyaW5nczsKICAgICB3aGlsZSAocG9vbCAhPSBOVUxMKSB7Ci0JaWYgKHBvb2wtPmVuZCAtIHBvb2wtPmZyZWUgPiBuYW1lbGVuKQorCWlmIChwb29sLT5lbmQgLSBwb29sLT5mcmVlID4gbmFtZWxlbiArIHBsZW4gKyAxKQogCSAgICBnb3RvIGZvdW5kX3Bvb2w7CiAJaWYgKHBvb2wtPnNpemUgPiBzaXplKSBzaXplID0gcG9vbC0+c2l6ZTsKIAlwb29sID0gcG9vbC0+bmV4dDsKQEAgLTE5OSw4ICsyMzgsOCBAQAogICAgIGlmIChwb29sID09IE5VTEwpIHsKICAgICAgICAgaWYgKHNpemUgPT0gMCkgc2l6ZSA9IDEwMDA7CiAJZWxzZSBzaXplICo9IDQ7IC8qIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotICAgICAgICBpZiAoc2l6ZSA8IDQgKiBuYW1lbGVuKSAKLQkgICAgc2l6ZSA9IDQgKiBuYW1lbGVuOyAvKiBqdXN0IGluIGNhc2UgISAqLworICAgICAgICBpZiAoc2l6ZSA8IDQgKiAobmFtZWxlbiArIHBsZW4gKyAxKSkKKwkgICAgc2l6ZSA9IDQgKiAobmFtZWxlbiArIHBsZW4gKyAxKTsgLyoganVzdCBpbiBjYXNlICEgKi8KIAlwb29sID0gKHhtbERpY3RTdHJpbmdzUHRyKSB4bWxNYWxsb2Moc2l6ZW9mKHhtbERpY3RTdHJpbmdzKSArIHNpemUpOwogCWlmIChwb29sID09IE5VTEwpCiAJICAgIHJldHVybihOVUxMKTsKQEAgLTIxMCwyNyArMjQ5LDEwNiBAQAogCXBvb2wtPmVuZCA9ICZwb29sLT5hcnJheVtzaXplXTsKIAlwb29sLT5uZXh0ID0gZGljdC0+c3RyaW5nczsKIAlkaWN0LT5zdHJpbmdzID0gcG9vbDsKKyNpZmRlZiBESUNUX0RFQlVHX1BBVFRFUk5TCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKyIpOworI2VuZGlmCiAgICAgfQogZm91bmRfcG9vbDoKICAgICByZXQgPSBwb29sLT5mcmVlOwogICAgIG1lbWNweShwb29sLT5mcmVlLCBwcmVmaXgsIHBsZW4pOwogICAgIHBvb2wtPmZyZWUgKz0gcGxlbjsKICAgICAqKHBvb2wtPmZyZWUrKykgPSAnOic7Ci0gICAgbmFtZWxlbiAtPSBwbGVuICsgMTsKICAgICBtZW1jcHkocG9vbC0+ZnJlZSwgbmFtZSwgbmFtZWxlbik7CiAgICAgcG9vbC0+ZnJlZSArPSBuYW1lbGVuOwogICAgICoocG9vbC0+ZnJlZSsrKSA9IDA7CisgICAgcG9vbC0+bmJTdHJpbmdzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNpZmRlZiBXSVRIX0JJR19LRVkKIC8qCi0gKiB4bWxEaWN0Q29tcHV0ZUtleToKLSAqIENhbGN1bGF0ZSB0aGUgaGFzaCBrZXkKKyAqIHhtbERpY3RDb21wdXRlQmlnS2V5OgorICoKKyAqIENhbGN1bGF0ZSBhIGhhc2gga2V5IHVzaW5nIGEgZ29vZCBoYXNoIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2VsbCBmb3IKKyAqIGxhcmdlciBoYXNoIHRhYmxlIHNpemVzLgorICoKKyAqIEhhc2ggZnVuY3Rpb24gYnkgIk9uZS1hdC1hLVRpbWUgSGFzaCIgc2VlCisgKiBodHRwOi8vYnVydGxlYnVydGxlLm5ldC9ib2IvaGFzaC9kb29icy5odG1sCisgKi8KKworc3RhdGljIHVpbnQzMl90Cit4bWxEaWN0Q29tcHV0ZUJpZ0tleShjb25zdCB4bWxDaGFyKiBkYXRhLCBpbnQgbmFtZWxlbikgeworICAgIHVpbnQzMl90IGhhc2g7CisgICAgaW50IGk7CisKKyAgICBpZiAobmFtZWxlbiA8PSAwIHx8IGRhdGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisgICAgaGFzaCA9IDA7CisKKyAgICBmb3IgKGkgPSAwO2kgPCBuYW1lbGVuOyBpKyspIHsKKyAgICAgICAgaGFzaCArPSBkYXRhW2ldOworCWhhc2ggKz0gKGhhc2ggPDwgMTApOworCWhhc2ggXj0gKGhhc2ggPj4gNik7CisgICAgfQorICAgIGhhc2ggKz0gKGhhc2ggPDwgMyk7CisgICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CisgICAgaGFzaCArPSAoaGFzaCA8PCAxNSk7CisKKyAgICByZXR1cm4gaGFzaDsKK30KKworLyoKKyAqIHhtbERpY3RDb21wdXRlQmlnUUtleToKKyAqCisgKiBDYWxjdWxhdGUgYSBoYXNoIGtleSBmb3IgdHdvIHN0cmluZ3MgdXNpbmcgYSBnb29kIGhhc2ggZnVuY3Rpb24KKyAqIHRoYXQgd29ya3Mgd2VsbCBmb3IgbGFyZ2VyIGhhc2ggdGFibGUgc2l6ZXMuCisgKgorICogSGFzaCBmdW5jdGlvbiBieSAiT25lLWF0LWEtVGltZSBIYXNoIiBzZWUKKyAqIGh0dHA6Ly9idXJ0bGVidXJ0bGUubmV0L2JvYi9oYXNoL2Rvb2JzLmh0bWwKKyAqCisgKiBOZWl0aGVyIG9mIHRoZSB0d28gc3RyaW5ncyBtdXN0IGJlIE5VTEwuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCi14bWxEaWN0Q29tcHV0ZUtleShjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgbmFtZWxlbikgeworeG1sRGljdENvbXB1dGVCaWdRS2V5KGNvbnN0IHhtbENoYXIgKnByZWZpeCwgaW50IHBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IGxlbikKK3sKKyAgICB1aW50MzJfdCBoYXNoOworICAgIGludCBpOworCisgICAgaGFzaCA9IDA7CisKKyAgICBmb3IgKGkgPSAwO2kgPCBwbGVuOyBpKyspIHsKKyAgICAgICAgaGFzaCArPSBwcmVmaXhbaV07CisJaGFzaCArPSAoaGFzaCA8PCAxMCk7CisJaGFzaCBePSAoaGFzaCA+PiA2KTsKKyAgICB9CisgICAgaGFzaCArPSAnOic7CisgICAgaGFzaCArPSAoaGFzaCA8PCAxMCk7CisgICAgaGFzaCBePSAoaGFzaCA+PiA2KTsKKworICAgIGZvciAoaSA9IDA7aSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGhhc2ggKz0gbmFtZVtpXTsKKwloYXNoICs9IChoYXNoIDw8IDEwKTsKKwloYXNoIF49IChoYXNoID4+IDYpOworICAgIH0KKyAgICBoYXNoICs9IChoYXNoIDw8IDMpOworICAgIGhhc2ggXj0gKGhhc2ggPj4gMTEpOworICAgIGhhc2ggKz0gKGhhc2ggPDwgMTUpOworCisgICAgcmV0dXJuIGhhc2g7Cit9CisjZW5kaWYgLyogV0lUSF9CSUdfS0VZICovCisKKy8qCisgKiB4bWxEaWN0Q29tcHV0ZUZhc3RLZXk6CisgKgorICogQ2FsY3VsYXRlIGEgaGFzaCBrZXkgdXNpbmcgYSBmYXN0IGhhc2ggZnVuY3Rpb24gdGhhdCB3b3JrcyB3ZWxsCisgKiBmb3IgbG93IGhhc2ggdGFibGUgZmlsbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3htbERpY3RDb21wdXRlRmFzdEtleShjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgbmFtZWxlbikgewogICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSAwTDsKLSAgICAKKwogICAgIGlmIChuYW1lID09IE5VTEwpIHJldHVybigwKTsKICAgICB2YWx1ZSA9ICpuYW1lOwogICAgIHZhbHVlIDw8PSA1OwpAQCAtMjU0LDI0ICszNzIsMjQgQEAKIH0KIAogLyoKLSAqIHhtbERpY3RDb21wdXRlUUtleToKLSAqIENhbGN1bGF0ZSB0aGUgaGFzaCBrZXkKKyAqIHhtbERpY3RDb21wdXRlRmFzdFFLZXk6CisgKgorICogQ2FsY3VsYXRlIGEgaGFzaCBrZXkgZm9yIHR3byBzdHJpbmdzIHVzaW5nIGEgZmFzdCBoYXNoIGZ1bmN0aW9uCisgKiB0aGF0IHdvcmtzIHdlbGwgZm9yIGxvdyBoYXNoIHRhYmxlIGZpbGwuCisgKgorICogTmVpdGhlciBvZiB0aGUgdHdvIHN0cmluZ3MgbXVzdCBiZSBOVUxMLgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwoteG1sRGljdENvbXB1dGVRS2V5KGNvbnN0IHhtbENoYXIgKnByZWZpeCwgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IGxlbikKK3htbERpY3RDb21wdXRlRmFzdFFLZXkoY29uc3QgeG1sQ2hhciAqcHJlZml4LCBpbnQgcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IGxlbikKIHsKICAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMEw7Ci0gICAgaW50IHBsZW47Ci0gICAgCi0gICAgaWYgKHByZWZpeCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oeG1sRGljdENvbXB1dGVLZXkobmFtZSwgbGVuKSk7CiAKLSAgICBwbGVuID0geG1sU3RybGVuKHByZWZpeCk7CiAgICAgaWYgKHBsZW4gPT0gMCkKIAl2YWx1ZSArPSAzMCAqICh1bnNpZ25lZCBsb25nKSAnOic7CiAgICAgZWxzZQogCXZhbHVlICs9IDMwICogKCpwcmVmaXgpOwotICAgIAorCiAgICAgaWYgKGxlbiA+IDEwKSB7CiAgICAgICAgIHZhbHVlICs9IG5hbWVbbGVuIC0gKHBsZW4gKyAxICsgMSldOwogICAgICAgICBsZW4gPSAxMDsKQEAgLTMyNiw3ICs0NDQsMTEgQEAKICAgICBpZiAoIXhtbERpY3RJbml0aWFsaXplZCkKICAgICAgICAgaWYgKCF4bWxJbml0aWFsaXplRGljdCgpKQogICAgICAgICAgICAgcmV0dXJuKE5VTEwpOwotIAorCisjaWZkZWYgRElDVF9ERUJVR19QQVRURVJOUworICAgIGZwcmludGYoc3RkZXJyLCAiQyIpOworI2VuZGlmCisKICAgICBkaWN0ID0geG1sTWFsbG9jKHNpemVvZih4bWxEaWN0KSk7CiAgICAgaWYgKGRpY3QpIHsKICAgICAgICAgZGljdC0+cmVmX2NvdW50ZXIgPSAxOwpAQCAtMzM3LDExICs0NTksOCBAQAogCWRpY3QtPnN0cmluZ3MgPSBOVUxMOwogCWRpY3QtPnN1YmRpY3QgPSBOVUxMOwogICAgICAgICBpZiAoZGljdC0+ZGljdCkgewotICAgICAgICAgICAgaWYgKChkaWN0LT5tdXRleCA9IHhtbE5ld1JNdXRleCgpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGRpY3QtPmRpY3QsIDAsIE1JTl9ESUNUX1NJWkUgKiBzaXplb2YoeG1sRGljdEVudHJ5KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKGRpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sRnJlZShkaWN0LT5kaWN0KTsKKwkgICAgbWVtc2V0KGRpY3QtPmRpY3QsIDAsIE1JTl9ESUNUX1NJWkUgKiBzaXplb2YoeG1sRGljdEVudHJ5KSk7CisJICAgIHJldHVybihkaWN0KTsKICAgICAgICAgfQogICAgICAgICB4bWxGcmVlKGRpY3QpOwogICAgIH0KQEAgLTM2Miw4ICs0ODEsMTEgQEAKIHhtbERpY3RQdHIKIHhtbERpY3RDcmVhdGVTdWIoeG1sRGljdFB0ciBzdWIpIHsKICAgICB4bWxEaWN0UHRyIGRpY3QgPSB4bWxEaWN0Q3JlYXRlKCk7Ci0gIAorCiAgICAgaWYgKChkaWN0ICE9IE5VTEwpICYmIChzdWIgIT0gTlVMTCkpIHsKKyNpZmRlZiBESUNUX0RFQlVHX1BBVFRFUk5TCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUiIpOworI2VuZGlmCiAgICAgICAgIGRpY3QtPnN1YmRpY3QgPSBzdWI7CiAJeG1sRGljdFJlZmVyZW5jZShkaWN0LT5zdWJkaWN0KTsKICAgICB9CkBAIC00MDIsMTQgKzUyNCwxNiBAQAogICovCiBzdGF0aWMgaW50CiB4bWxEaWN0R3Jvdyh4bWxEaWN0UHRyIGRpY3QsIGludCBzaXplKSB7Ci0gICAgdW5zaWduZWQgbG9uZyBrZXk7CisgICAgdW5zaWduZWQgbG9uZyBrZXksIG9rZXk7CiAgICAgaW50IG9sZHNpemUsIGk7CiAgICAgeG1sRGljdEVudHJ5UHRyIGl0ZXIsIG5leHQ7CiAgICAgc3RydWN0IF94bWxEaWN0RW50cnkgKm9sZGRpY3Q7CiAjaWZkZWYgREVCVUdfR1JPVwogICAgIHVuc2lnbmVkIGxvbmcgbmJFbGVtID0gMDsKICNlbmRpZgotICAKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQga2VlcF9rZXlzID0gMTsKKwogICAgIGlmIChkaWN0ID09IE5VTEwpCiAJcmV0dXJuKC0xKTsKICAgICBpZiAoc2l6ZSA8IDgpCkBAIC00MTcsMTEgKzU0MSwxNyBAQAogICAgIGlmIChzaXplID4gOCAqIDIwNDgpCiAJcmV0dXJuKC0xKTsKIAorI2lmZGVmIERJQ1RfREVCVUdfUEFUVEVSTlMKKyAgICBmcHJpbnRmKHN0ZGVyciwgIioiKTsKKyNlbmRpZgorCiAgICAgb2xkc2l6ZSA9IGRpY3QtPnNpemU7CiAgICAgb2xkZGljdCA9IGRpY3QtPmRpY3Q7CiAgICAgaWYgKG9sZGRpY3QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuKC0xKTsKLSAgCisgICAgaWYgKG9sZHNpemUgPT0gTUlOX0RJQ1RfU0laRSkKKyAgICAgICAga2VlcF9rZXlzID0gMDsKKwogICAgIGRpY3QtPmRpY3QgPSB4bWxNYWxsb2Moc2l6ZSAqIHNpemVvZih4bWxEaWN0RW50cnkpKTsKICAgICBpZiAoZGljdC0+ZGljdCA9PSBOVUxMKSB7CiAJZGljdC0+ZGljdCA9IG9sZGRpY3Q7CkBAIC00MzEsMTcgKzU2MSw0NCBAQAogICAgIGRpY3QtPnNpemUgPSBzaXplOwogCiAgICAgLyoJSWYgdGhlIHR3byBsb29wcyBhcmUgbWVyZ2VkLCB0aGVyZSB3b3VsZCBiZSBzaXR1YXRpb25zIHdoZXJlCi0JYSBuZXcgZW50cnkgbmVlZHMgdG8gYWxsb2NhdGVkIGFuZCBkYXRhIGNvcGllZCBpbnRvIGl0IGZyb20gCi0JdGhlIG1haW4gZGljdC4gU28gaW5zdGVhZCwgd2UgcnVuIHRocm91Z2ggdGhlIGFycmF5IHR3aWNlLCBmaXJzdAotCWNvcHlpbmcgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgbWFpbiBhcnJheSAod2hlcmUgd2UgY2FuJ3QgZ2V0Ci0JY29uZmxpY3RzKSBhbmQgdGhlbiB0aGUgcmVzdCwgc28gd2Ugb25seSBmcmVlIChhbmQgZG9uJ3QgYWxsb2NhdGUpCisJYSBuZXcgZW50cnkgbmVlZHMgdG8gYWxsb2NhdGVkIGFuZCBkYXRhIGNvcGllZCBpbnRvIGl0IGZyb20KKwl0aGUgbWFpbiBkaWN0LiBJdCBpcyBuaWNlciB0byBydW4gdGhyb3VnaCB0aGUgYXJyYXkgdHdpY2UsIGZpcnN0CisJY29weWluZyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBtYWluIGFycmF5IChsZXNzIHByb2JhYmlsaXR5IG9mCisJYWxsb2NhdGUpIGFuZCB0aGVuIHRoZSByZXN0LCBzbyB3ZSBvbmx5IGZyZWUgaW4gdGhlIHNlY29uZCBsb29wLgogICAgICovCiAgICAgZm9yIChpID0gMDsgaSA8IG9sZHNpemU7IGkrKykgewotCWlmIChvbGRkaWN0W2ldLnZhbGlkID09IDApIAorCWlmIChvbGRkaWN0W2ldLnZhbGlkID09IDApCiAJICAgIGNvbnRpbnVlOwotCWtleSA9IHhtbERpY3RDb21wdXRlS2V5KG9sZGRpY3RbaV0ubmFtZSwgb2xkZGljdFtpXS5sZW4pICUgZGljdC0+c2l6ZTsKLQltZW1jcHkoJihkaWN0LT5kaWN0W2tleV0pLCAmKG9sZGRpY3RbaV0pLCBzaXplb2YoeG1sRGljdEVudHJ5KSk7Ci0JZGljdC0+ZGljdFtrZXldLm5leHQgPSBOVUxMOworCisJaWYgKGtlZXBfa2V5cykKKwkgICAgb2tleSA9IG9sZGRpY3RbaV0ub2tleTsKKwllbHNlCisJICAgIG9rZXkgPSB4bWxEaWN0Q29tcHV0ZUtleShkaWN0LCBvbGRkaWN0W2ldLm5hbWUsIG9sZGRpY3RbaV0ubGVuKTsKKwlrZXkgPSBva2V5ICUgZGljdC0+c2l6ZTsKKworCWlmIChkaWN0LT5kaWN0W2tleV0udmFsaWQgPT0gMCkgeworCSAgICBtZW1jcHkoJihkaWN0LT5kaWN0W2tleV0pLCAmKG9sZGRpY3RbaV0pLCBzaXplb2YoeG1sRGljdEVudHJ5KSk7CisJICAgIGRpY3QtPmRpY3Rba2V5XS5uZXh0ID0gTlVMTDsKKwkgICAgZGljdC0+ZGljdFtrZXldLm9rZXkgPSBva2V5OworCX0gZWxzZSB7CisJICAgIHhtbERpY3RFbnRyeVB0ciBlbnRyeTsKKworCSAgICBlbnRyeSA9IHhtbE1hbGxvYyhzaXplb2YoeG1sRGljdEVudHJ5KSk7CisJICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisJCWVudHJ5LT5uYW1lID0gb2xkZGljdFtpXS5uYW1lOworCQllbnRyeS0+bGVuID0gb2xkZGljdFtpXS5sZW47CisJCWVudHJ5LT5va2V5ID0gb2tleTsKKwkJZW50cnktPm5leHQgPSBkaWN0LT5kaWN0W2tleV0ubmV4dDsKKwkJZW50cnktPnZhbGlkID0gMTsKKwkJZGljdC0+ZGljdFtrZXldLm5leHQgPSBlbnRyeTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIC8qCisJCSAqIHdlIGRvbid0IGhhdmUgbXVjaCB3YXlzIHRvIGFsZXJ0IGZyb20gaGVyZWkKKwkJICogcmVzdWx0IGlzIGxvb3NpbmcgYW4gZW50cnkgYW5kIHVuaWNpdHkgZ2FyYW50ZWUKKwkJICovCisJICAgICAgICByZXQgPSAtMTsKKwkgICAgfQorCX0KICNpZmRlZiBERUJVR19HUk9XCiAJbmJFbGVtKys7CiAjZW5kaWYKQEAgLTQ1NiwxNSArNjEzLDIxIEBACiAJICAgICAqIHB1dCBiYWNrIHRoZSBlbnRyeSBpbiB0aGUgbmV3IGRpY3QKIAkgICAgICovCiAKLQkgICAga2V5ID0geG1sRGljdENvbXB1dGVLZXkoaXRlci0+bmFtZSwgaXRlci0+bGVuKSAlIGRpY3QtPnNpemU7CisJICAgIGlmIChrZWVwX2tleXMpCisJCW9rZXkgPSBpdGVyLT5va2V5OworCSAgICBlbHNlCisJCW9rZXkgPSB4bWxEaWN0Q29tcHV0ZUtleShkaWN0LCBpdGVyLT5uYW1lLCBpdGVyLT5sZW4pOworCSAgICBrZXkgPSBva2V5ICUgZGljdC0+c2l6ZTsKIAkgICAgaWYgKGRpY3QtPmRpY3Rba2V5XS52YWxpZCA9PSAwKSB7CiAJCW1lbWNweSgmKGRpY3QtPmRpY3Rba2V5XSksIGl0ZXIsIHNpemVvZih4bWxEaWN0RW50cnkpKTsKIAkJZGljdC0+ZGljdFtrZXldLm5leHQgPSBOVUxMOwogCQlkaWN0LT5kaWN0W2tleV0udmFsaWQgPSAxOworCQlkaWN0LT5kaWN0W2tleV0ub2tleSA9IG9rZXk7CiAJCXhtbEZyZWUoaXRlcik7CiAJICAgIH0gZWxzZSB7Ci0JICAgIAlpdGVyLT5uZXh0ID0gZGljdC0+ZGljdFtrZXldLm5leHQ7Ci0JICAgIAlkaWN0LT5kaWN0W2tleV0ubmV4dCA9IGl0ZXI7CisJCWl0ZXItPm5leHQgPSBkaWN0LT5kaWN0W2tleV0ubmV4dDsKKwkJaXRlci0+b2tleSA9IG9rZXk7CisJCWRpY3QtPmRpY3Rba2V5XS5uZXh0ID0gaXRlcjsKIAkgICAgfQogCiAjaWZkZWYgREVCVUdfR1JPVwpAQCAtNDgyLDcgKzY0NSw3IEBACiAJICAgICJ4bWxEaWN0R3JvdyA6IGZyb20gJWQgdG8gJWQsICVkIGVsZW1zXG4iLCBvbGRzaXplLCBzaXplLCBuYkVsZW0pOwogI2VuZGlmCiAKLSAgICByZXR1cm4oMCk7CisgICAgcmV0dXJuKHJldCk7CiB9CiAKIC8qKgpAQCAtNTQ1LDcgKzcwOCw2IEBACiAJeG1sRnJlZShwb29sKTsKIAlwb29sID0gbmV4dHA7CiAgICAgfQotICAgIHhtbEZyZWVSTXV0ZXgoZGljdC0+bXV0ZXgpOwogICAgIHhtbEZyZWUoZGljdCk7CiB9CiAKQEAgLTU3MCwxMiArNzMyLDEyIEBACiAJcmV0dXJuKE5VTEwpOwogCiAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgIGxlbiA9IHhtbFN0cmxlbihuYW1lKTsKKyAgICAgICAgbGVuID0gc3RybGVuKChjb25zdCBjaGFyICopIG5hbWUpOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZHVwbGljYXRlIGFuZCBpbnNlcnRpb24gbG9jYXRpb24uCiAgICAgICovCi0gICAgb2tleSA9IHhtbERpY3RDb21wdXRlS2V5KG5hbWUsIGxlbik7CisgICAgb2tleSA9IHhtbERpY3RDb21wdXRlS2V5KGRpY3QsIG5hbWUsIGxlbik7CiAgICAga2V5ID0gb2tleSAlIGRpY3QtPnNpemU7CiAgICAgaWYgKGRpY3QtPmRpY3Rba2V5XS52YWxpZCA9PSAwKSB7CiAJaW5zZXJ0ID0gTlVMTDsKQEAgLTU4Myw1NSArNzQ1LDY2IEBACiAJZm9yIChpbnNlcnQgPSAmKGRpY3QtPmRpY3Rba2V5XSk7IGluc2VydC0+bmV4dCAhPSBOVUxMOwogCSAgICAgaW5zZXJ0ID0gaW5zZXJ0LT5uZXh0KSB7CiAjaWZkZWYgX19HTlVDX18KLQkgICAgaWYgKGluc2VydC0+bGVuID09IGxlbikgeworCSAgICBpZiAoKGluc2VydC0+b2tleSA9PSBva2V5KSAmJiAoaW5zZXJ0LT5sZW4gPT0gbGVuKSkgewogCQlpZiAoIW1lbWNtcChpbnNlcnQtPm5hbWUsIG5hbWUsIGxlbikpCiAJCSAgICByZXR1cm4oaW5zZXJ0LT5uYW1lKTsKIAkgICAgfQogI2Vsc2UKLQkgICAgaWYgKChpbnNlcnQtPmxlbiA9PSBsZW4pICYmCisJICAgIGlmICgoaW5zZXJ0LT5va2V5ID09IG9rZXkpICYmIChpbnNlcnQtPmxlbiA9PSBsZW4pICYmCiAJICAgICAgICAoIXhtbFN0cm5jbXAoaW5zZXJ0LT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkJcmV0dXJuKGluc2VydC0+bmFtZSk7CiAjZW5kaWYKIAkgICAgbmJpKys7CiAJfQogI2lmZGVmIF9fR05VQ19fCi0JaWYgKGluc2VydC0+bGVuID09IGxlbikgeworCWlmICgoaW5zZXJ0LT5va2V5ID09IG9rZXkpICYmIChpbnNlcnQtPmxlbiA9PSBsZW4pKSB7CiAJICAgIGlmICghbWVtY21wKGluc2VydC0+bmFtZSwgbmFtZSwgbGVuKSkKIAkJcmV0dXJuKGluc2VydC0+bmFtZSk7CiAJfQogI2Vsc2UKLQlpZiAoKGluc2VydC0+bGVuID09IGxlbikgJiYKKwlpZiAoKGluc2VydC0+b2tleSA9PSBva2V5KSAmJiAoaW5zZXJ0LT5sZW4gPT0gbGVuKSAmJgogCSAgICAoIXhtbFN0cm5jbXAoaW5zZXJ0LT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkgICAgcmV0dXJuKGluc2VydC0+bmFtZSk7CiAjZW5kaWYKICAgICB9CiAKICAgICBpZiAoZGljdC0+c3ViZGljdCkgewotCWtleSA9IG9rZXkgJSBkaWN0LT5zdWJkaWN0LT5zaXplOworICAgICAgICB1bnNpZ25lZCBsb25nIHNrZXk7CisKKyAgICAgICAgLyogd2UgY2Fubm90IGFsd2F5cyByZXVzZSB0aGUgc2FtZSBva2V5IGZvciB0aGUgc3ViZGljdCAqLworICAgICAgICBpZiAoKChkaWN0LT5zaXplID09IE1JTl9ESUNUX1NJWkUpICYmCisJICAgICAoZGljdC0+c3ViZGljdC0+c2l6ZSAhPSBNSU5fRElDVF9TSVpFKSkgfHwKKyAgICAgICAgICAgICgoZGljdC0+c2l6ZSAhPSBNSU5fRElDVF9TSVpFKSAmJgorCSAgICAgKGRpY3QtPnN1YmRpY3QtPnNpemUgPT0gTUlOX0RJQ1RfU0laRSkpKQorCSAgICBza2V5ID0geG1sRGljdENvbXB1dGVLZXkoZGljdC0+c3ViZGljdCwgbmFtZSwgbGVuKTsKKwllbHNlCisJICAgIHNrZXkgPSBva2V5OworCisJa2V5ID0gc2tleSAlIGRpY3QtPnN1YmRpY3QtPnNpemU7CiAJaWYgKGRpY3QtPnN1YmRpY3QtPmRpY3Rba2V5XS52YWxpZCAhPSAwKSB7CiAJICAgIHhtbERpY3RFbnRyeVB0ciB0bXA7CiAKIAkgICAgZm9yICh0bXAgPSAmKGRpY3QtPnN1YmRpY3QtPmRpY3Rba2V5XSk7IHRtcC0+bmV4dCAhPSBOVUxMOwogCQkgdG1wID0gdG1wLT5uZXh0KSB7CiAjaWZkZWYgX19HTlVDX18KLQkJaWYgKHRtcC0+bGVuID09IGxlbikgeworCQlpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSkgewogCQkgICAgaWYgKCFtZW1jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKQogCQkJcmV0dXJuKHRtcC0+bmFtZSk7CiAJCX0KICNlbHNlCi0JCWlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCQlpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkgICAgKCF4bWxTdHJuY21wKHRtcC0+bmFtZSwgbmFtZSwgbGVuKSkpCiAJCSAgICByZXR1cm4odG1wLT5uYW1lKTsKICNlbmRpZgogCQluYmkrKzsKIAkgICAgfQogI2lmZGVmIF9fR05VQ19fCi0JICAgIGlmICh0bXAtPmxlbiA9PSBsZW4pIHsKKwkgICAgaWYgKCh0bXAtPm9rZXkgPT0gc2tleSkgJiYgKHRtcC0+bGVuID09IGxlbikpIHsKIAkJaWYgKCFtZW1jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKQogCQkgICAgcmV0dXJuKHRtcC0+bmFtZSk7CiAJICAgIH0KICNlbHNlCi0JICAgIGlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCSAgICBpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkoIXhtbFN0cm5jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkJcmV0dXJuKHRtcC0+bmFtZSk7CiAjZW5kaWYKQEAgLTY1Myw2ICs4MjYsNyBAQAogICAgIGVudHJ5LT5sZW4gPSBsZW47CiAgICAgZW50cnktPm5leHQgPSBOVUxMOwogICAgIGVudHJ5LT52YWxpZCA9IDE7CisgICAgZW50cnktPm9rZXkgPSBva2V5OwogCiAKICAgICBpZiAoaW5zZXJ0ICE9IE5VTEwpIApAQCAtNjYxLDggKzgzNSwxMCBAQAogICAgIGRpY3QtPm5iRWxlbXMrKzsKIAogICAgIGlmICgobmJpID4gTUFYX0hBU0hfTEVOKSAmJgotICAgICAgICAoZGljdC0+c2l6ZSA8PSAoKE1BWF9ESUNUX0hBU0ggLyAyKSAvIE1BWF9IQVNIX0xFTikpKQotCXhtbERpY3RHcm93KGRpY3QsIE1BWF9IQVNIX0xFTiAqIDIgKiBkaWN0LT5zaXplKTsKKyAgICAgICAgKGRpY3QtPnNpemUgPD0gKChNQVhfRElDVF9IQVNIIC8gMikgLyBNQVhfSEFTSF9MRU4pKSkgeworCWlmICh4bWxEaWN0R3JvdyhkaWN0LCBNQVhfSEFTSF9MRU4gKiAyICogZGljdC0+c2l6ZSkgIT0gMCkKKwkgICAgcmV0dXJuKE5VTEwpOworICAgIH0KICAgICAvKiBOb3RlIHRoYXQgZW50cnkgbWF5IGhhdmUgYmVlbiBmcmVlZCBhdCB0aGlzIHBvaW50IGJ5IHhtbERpY3RHcm93ICovCiAKICAgICByZXR1cm4ocmV0KTsKQEAgLTY4NywxMiArODYzLDEyIEBACiAJcmV0dXJuKE5VTEwpOwogCiAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgIGxlbiA9IHhtbFN0cmxlbihuYW1lKTsKKyAgICAgICAgbGVuID0gc3RybGVuKChjb25zdCBjaGFyICopIG5hbWUpOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZHVwbGljYXRlIGFuZCBpbnNlcnRpb24gbG9jYXRpb24uCiAgICAgICovCi0gICAgb2tleSA9IHhtbERpY3RDb21wdXRlS2V5KG5hbWUsIGxlbik7CisgICAgb2tleSA9IHhtbERpY3RDb21wdXRlS2V5KGRpY3QsIG5hbWUsIGxlbik7CiAgICAga2V5ID0gb2tleSAlIGRpY3QtPnNpemU7CiAgICAgaWYgKGRpY3QtPmRpY3Rba2V5XS52YWxpZCA9PSAwKSB7CiAJaW5zZXJ0ID0gTlVMTDsKQEAgLTcwMCw2MCArODc2LDcwIEBACiAJZm9yIChpbnNlcnQgPSAmKGRpY3QtPmRpY3Rba2V5XSk7IGluc2VydC0+bmV4dCAhPSBOVUxMOwogCSAgICAgaW5zZXJ0ID0gaW5zZXJ0LT5uZXh0KSB7CiAjaWZkZWYgX19HTlVDX18KLQkgICAgaWYgKGluc2VydC0+bGVuID09IGxlbikgeworCSAgICBpZiAoKGluc2VydC0+b2tleSA9PSBva2V5KSAmJiAoaW5zZXJ0LT5sZW4gPT0gbGVuKSkgewogCQlpZiAoIW1lbWNtcChpbnNlcnQtPm5hbWUsIG5hbWUsIGxlbikpCiAJCSAgICByZXR1cm4oaW5zZXJ0LT5uYW1lKTsKIAkgICAgfQogI2Vsc2UKLQkgICAgaWYgKChpbnNlcnQtPmxlbiA9PSBsZW4pICYmCisJICAgIGlmICgoaW5zZXJ0LT5va2V5ID09IG9rZXkpICYmIChpbnNlcnQtPmxlbiA9PSBsZW4pICYmCiAJICAgICAgICAoIXhtbFN0cm5jbXAoaW5zZXJ0LT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkJcmV0dXJuKGluc2VydC0+bmFtZSk7CiAjZW5kaWYKIAkgICAgbmJpKys7CiAJfQogI2lmZGVmIF9fR05VQ19fCi0JaWYgKGluc2VydC0+bGVuID09IGxlbikgeworCWlmICgoaW5zZXJ0LT5va2V5ID09IG9rZXkpICYmIChpbnNlcnQtPmxlbiA9PSBsZW4pKSB7CiAJICAgIGlmICghbWVtY21wKGluc2VydC0+bmFtZSwgbmFtZSwgbGVuKSkKIAkJcmV0dXJuKGluc2VydC0+bmFtZSk7CiAJfQogI2Vsc2UKLQlpZiAoKGluc2VydC0+bGVuID09IGxlbikgJiYKKwlpZiAoKGluc2VydC0+b2tleSA9PSBva2V5KSAmJiAoaW5zZXJ0LT5sZW4gPT0gbGVuKSAmJgogCSAgICAoIXhtbFN0cm5jbXAoaW5zZXJ0LT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkgICAgcmV0dXJuKGluc2VydC0+bmFtZSk7CiAjZW5kaWYKICAgICB9CiAKICAgICBpZiAoZGljdC0+c3ViZGljdCkgewotCWtleSA9IG9rZXkgJSBkaWN0LT5zdWJkaWN0LT5zaXplOworICAgICAgICB1bnNpZ25lZCBsb25nIHNrZXk7CisKKyAgICAgICAgLyogd2UgY2Fubm90IGFsd2F5cyByZXVzZSB0aGUgc2FtZSBva2V5IGZvciB0aGUgc3ViZGljdCAqLworICAgICAgICBpZiAoKChkaWN0LT5zaXplID09IE1JTl9ESUNUX1NJWkUpICYmCisJICAgICAoZGljdC0+c3ViZGljdC0+c2l6ZSAhPSBNSU5fRElDVF9TSVpFKSkgfHwKKyAgICAgICAgICAgICgoZGljdC0+c2l6ZSAhPSBNSU5fRElDVF9TSVpFKSAmJgorCSAgICAgKGRpY3QtPnN1YmRpY3QtPnNpemUgPT0gTUlOX0RJQ1RfU0laRSkpKQorCSAgICBza2V5ID0geG1sRGljdENvbXB1dGVLZXkoZGljdC0+c3ViZGljdCwgbmFtZSwgbGVuKTsKKwllbHNlCisJICAgIHNrZXkgPSBva2V5OworCisJa2V5ID0gc2tleSAlIGRpY3QtPnN1YmRpY3QtPnNpemU7CiAJaWYgKGRpY3QtPnN1YmRpY3QtPmRpY3Rba2V5XS52YWxpZCAhPSAwKSB7CiAJICAgIHhtbERpY3RFbnRyeVB0ciB0bXA7CiAKIAkgICAgZm9yICh0bXAgPSAmKGRpY3QtPnN1YmRpY3QtPmRpY3Rba2V5XSk7IHRtcC0+bmV4dCAhPSBOVUxMOwogCQkgdG1wID0gdG1wLT5uZXh0KSB7CiAjaWZkZWYgX19HTlVDX18KLQkJaWYgKHRtcC0+bGVuID09IGxlbikgeworCQlpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSkgewogCQkgICAgaWYgKCFtZW1jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKQogCQkJcmV0dXJuKHRtcC0+bmFtZSk7CiAJCX0KICNlbHNlCi0JCWlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCQlpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkgICAgKCF4bWxTdHJuY21wKHRtcC0+bmFtZSwgbmFtZSwgbGVuKSkpCiAJCSAgICByZXR1cm4odG1wLT5uYW1lKTsKICNlbmRpZgogCQluYmkrKzsKIAkgICAgfQogI2lmZGVmIF9fR05VQ19fCi0JICAgIGlmICh0bXAtPmxlbiA9PSBsZW4pIHsKKwkgICAgaWYgKCh0bXAtPm9rZXkgPT0gc2tleSkgJiYgKHRtcC0+bGVuID09IGxlbikpIHsKIAkJaWYgKCFtZW1jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKQogCQkgICAgcmV0dXJuKHRtcC0+bmFtZSk7CiAJICAgIH0KICNlbHNlCi0JICAgIGlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCSAgICBpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkoIXhtbFN0cm5jbXAodG1wLT5uYW1lLCBuYW1lLCBsZW4pKSkKIAkJcmV0dXJuKHRtcC0+bmFtZSk7CiAjZW5kaWYKIAl9Ci0Ja2V5ID0gb2tleSAlIGRpY3QtPnNpemU7CiAgICAgfQogCiAgICAgLyogbm90IGZvdW5kICovCkBAIC03NjMsNyArOTQ5LDcgQEAKIC8qKgogICogeG1sRGljdFFMb29rdXA6CiAgKiBAZGljdDogdGhlIGRpY3Rpb25uYXJ5Ci0gKiBAcHJlZml4OiB0aGUgcHJlZml4IAorICogQHByZWZpeDogdGhlIHByZWZpeAogICogQG5hbWU6IHRoZSBuYW1lCiAgKgogICogQWRkIHRoZSBRTmFtZSBAcHJlZml4OkBuYW1lIHRvIHRoZSBoYXNoIEBkaWN0IGlmIG5vdCBwcmVzZW50LgpAQCAtNzc2LDU0ICs5NjIsNjcgQEAKICAgICB4bWxEaWN0RW50cnlQdHIgZW50cnk7CiAgICAgeG1sRGljdEVudHJ5UHRyIGluc2VydDsKICAgICBjb25zdCB4bWxDaGFyICpyZXQ7Ci0gICAgaW50IGxlbjsKKyAgICBpbnQgbGVuLCBwbGVuLCBsOwogCiAgICAgaWYgKChkaWN0ID09IE5VTEwpIHx8IChuYW1lID09IE5VTEwpKQogCXJldHVybihOVUxMKTsKKyAgICBpZiAocHJlZml4ID09IE5VTEwpCisgICAgICAgIHJldHVybih4bWxEaWN0TG9va3VwKGRpY3QsIG5hbWUsIC0xKSk7CiAKLSAgICBsZW4gPSB4bWxTdHJsZW4obmFtZSk7Ci0gICAgaWYgKHByZWZpeCAhPSBOVUxMKQotICAgICAgICBsZW4gKz0gMSArIHhtbFN0cmxlbihwcmVmaXgpOworICAgIGwgPSBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKikgbmFtZSk7CisgICAgcGxlbiA9IHN0cmxlbigoY29uc3QgY2hhciAqKSBwcmVmaXgpOworICAgIGxlbiArPSAxICsgcGxlbjsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBhbmQgaW5zZXJ0aW9uIGxvY2F0aW9uLgogICAgICAqLwotICAgIG9rZXkgPSB4bWxEaWN0Q29tcHV0ZVFLZXkocHJlZml4LCBuYW1lLCBsZW4pOworICAgIG9rZXkgPSB4bWxEaWN0Q29tcHV0ZVFLZXkoZGljdCwgcHJlZml4LCBwbGVuLCBuYW1lLCBsKTsKICAgICBrZXkgPSBva2V5ICUgZGljdC0+c2l6ZTsKICAgICBpZiAoZGljdC0+ZGljdFtrZXldLnZhbGlkID09IDApIHsKIAlpbnNlcnQgPSBOVUxMOwogICAgIH0gZWxzZSB7CiAJZm9yIChpbnNlcnQgPSAmKGRpY3QtPmRpY3Rba2V5XSk7IGluc2VydC0+bmV4dCAhPSBOVUxMOwogCSAgICAgaW5zZXJ0ID0gaW5zZXJ0LT5uZXh0KSB7Ci0JICAgIGlmICgoaW5zZXJ0LT5sZW4gPT0gbGVuKSAmJgorCSAgICBpZiAoKGluc2VydC0+b2tleSA9PSBva2V5KSAmJiAoaW5zZXJ0LT5sZW4gPT0gbGVuKSAmJgogCSAgICAgICAgKHhtbFN0clFFcXVhbChwcmVmaXgsIG5hbWUsIGluc2VydC0+bmFtZSkpKQogCQlyZXR1cm4oaW5zZXJ0LT5uYW1lKTsKIAkgICAgbmJpKys7CiAJfQotCWlmICgoaW5zZXJ0LT5sZW4gPT0gbGVuKSAmJgorCWlmICgoaW5zZXJ0LT5va2V5ID09IG9rZXkpICYmIChpbnNlcnQtPmxlbiA9PSBsZW4pICYmCiAJICAgICh4bWxTdHJRRXF1YWwocHJlZml4LCBuYW1lLCBpbnNlcnQtPm5hbWUpKSkKIAkgICAgcmV0dXJuKGluc2VydC0+bmFtZSk7CiAgICAgfQogCiAgICAgaWYgKGRpY3QtPnN1YmRpY3QpIHsKLQlrZXkgPSBva2V5ICUgZGljdC0+c3ViZGljdC0+c2l6ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBza2V5OworCisgICAgICAgIC8qIHdlIGNhbm5vdCBhbHdheXMgcmV1c2UgdGhlIHNhbWUgb2tleSBmb3IgdGhlIHN1YmRpY3QgKi8KKyAgICAgICAgaWYgKCgoZGljdC0+c2l6ZSA9PSBNSU5fRElDVF9TSVpFKSAmJgorCSAgICAgKGRpY3QtPnN1YmRpY3QtPnNpemUgIT0gTUlOX0RJQ1RfU0laRSkpIHx8CisgICAgICAgICAgICAoKGRpY3QtPnNpemUgIT0gTUlOX0RJQ1RfU0laRSkgJiYKKwkgICAgIChkaWN0LT5zdWJkaWN0LT5zaXplID09IE1JTl9ESUNUX1NJWkUpKSkKKwkgICAgc2tleSA9IHhtbERpY3RDb21wdXRlUUtleShkaWN0LT5zdWJkaWN0LCBwcmVmaXgsIHBsZW4sIG5hbWUsIGwpOworCWVsc2UKKwkgICAgc2tleSA9IG9rZXk7CisKKwlrZXkgPSBza2V5ICUgZGljdC0+c3ViZGljdC0+c2l6ZTsKIAlpZiAoZGljdC0+c3ViZGljdC0+ZGljdFtrZXldLnZhbGlkICE9IDApIHsKIAkgICAgeG1sRGljdEVudHJ5UHRyIHRtcDsKIAkgICAgZm9yICh0bXAgPSAmKGRpY3QtPnN1YmRpY3QtPmRpY3Rba2V5XSk7IHRtcC0+bmV4dCAhPSBOVUxMOwogCQkgdG1wID0gdG1wLT5uZXh0KSB7Ci0JCWlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCQlpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkgICAgKHhtbFN0clFFcXVhbChwcmVmaXgsIG5hbWUsIHRtcC0+bmFtZSkpKQogCQkgICAgcmV0dXJuKHRtcC0+bmFtZSk7CiAJCW5iaSsrOwogCSAgICB9Ci0JICAgIGlmICgodG1wLT5sZW4gPT0gbGVuKSAmJgorCSAgICBpZiAoKHRtcC0+b2tleSA9PSBza2V5KSAmJiAodG1wLT5sZW4gPT0gbGVuKSAmJgogCQkoeG1sU3RyUUVxdWFsKHByZWZpeCwgbmFtZSwgdG1wLT5uYW1lKSkpCiAJCXJldHVybih0bXAtPm5hbWUpOwogCX0KIAlrZXkgPSBva2V5ICUgZGljdC0+c2l6ZTsKICAgICB9CiAKLSAgICByZXQgPSB4bWxEaWN0QWRkUVN0cmluZyhkaWN0LCBwcmVmaXgsIG5hbWUsIGxlbik7CisgICAgcmV0ID0geG1sRGljdEFkZFFTdHJpbmcoZGljdCwgcHJlZml4LCBwbGVuLCBuYW1lLCBsKTsKICAgICBpZiAocmV0ID09IE5VTEwpCiAgICAgICAgIHJldHVybihOVUxMKTsKICAgICBpZiAoaW5zZXJ0ID09IE5VTEwpIHsKQEAgLTgzNyw2ICsxMDM2LDcgQEAKICAgICBlbnRyeS0+bGVuID0gbGVuOwogICAgIGVudHJ5LT5uZXh0ID0gTlVMTDsKICAgICBlbnRyeS0+dmFsaWQgPSAxOworICAgIGVudHJ5LT5va2V5ID0gb2tleTsKIAogICAgIGlmIChpbnNlcnQgIT0gTlVMTCkgCiAJaW5zZXJ0LT5uZXh0ID0gZW50cnk7CmRpZmYgLS1naXQgYS9lbGZnY2NoYWNrLmggYi9lbGZnY2NoYWNrLmgKaW5kZXggY2Q5NjA1Yy4uMTRjYWQ2ZCAxMDA2NDQKLS0tIGEvZWxmZ2NjaGFjay5oCisrKyBiL2VsZmdjY2hhY2suaApAQCAtMTk5MSw2ICsxOTkxLDE4IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQorI2lmZGVmIGJvdHRvbV90cmVlCisjdW5kZWYgeG1sQ2hpbGRFbGVtZW50Q291bnQKK2V4dGVybiBfX3R5cGVvZiAoeG1sQ2hpbGRFbGVtZW50Q291bnQpIHhtbENoaWxkRWxlbWVudENvdW50IF9fYXR0cmlidXRlKChhbGlhcygieG1sQ2hpbGRFbGVtZW50Q291bnRfX2ludGVybmFsX2FsaWFzIikpKTsKKyNlbHNlCisjaWZuZGVmIHhtbENoaWxkRWxlbWVudENvdW50CitleHRlcm4gX190eXBlb2YgKHhtbENoaWxkRWxlbWVudENvdW50KSB4bWxDaGlsZEVsZW1lbnRDb3VudF9faW50ZXJuYWxfYWxpYXMgX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisjZGVmaW5lIHhtbENoaWxkRWxlbWVudENvdW50IHhtbENoaWxkRWxlbWVudENvdW50X19pbnRlcm5hbF9hbGlhcworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCiAjaWZkZWYgYm90dG9tX2VuY29kaW5nCiAjdW5kZWYgeG1sQ2xlYW51cENoYXJFbmNvZGluZ0hhbmRsZXJzCiBleHRlcm4gX190eXBlb2YgKHhtbENsZWFudXBDaGFyRW5jb2RpbmdIYW5kbGVycykgeG1sQ2xlYW51cENoYXJFbmNvZGluZ0hhbmRsZXJzIF9fYXR0cmlidXRlKChhbGlhcygieG1sQ2xlYW51cENoYXJFbmNvZGluZ0hhbmRsZXJzX19pbnRlcm5hbF9hbGlhcyIpKSk7CkBAIC0zNDE5LDYgKzM0MzEsMTggQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCisjaWZkZWYgYm90dG9tX3RyZWUKKyN1bmRlZiB4bWxGaXJzdEVsZW1lbnRDaGlsZAorZXh0ZXJuIF9fdHlwZW9mICh4bWxGaXJzdEVsZW1lbnRDaGlsZCkgeG1sRmlyc3RFbGVtZW50Q2hpbGQgX19hdHRyaWJ1dGUoKGFsaWFzKCJ4bWxGaXJzdEVsZW1lbnRDaGlsZF9faW50ZXJuYWxfYWxpYXMiKSkpOworI2Vsc2UKKyNpZm5kZWYgeG1sRmlyc3RFbGVtZW50Q2hpbGQKK2V4dGVybiBfX3R5cGVvZiAoeG1sRmlyc3RFbGVtZW50Q2hpbGQpIHhtbEZpcnN0RWxlbWVudENoaWxkX19pbnRlcm5hbF9hbGlhcyBfX2F0dHJpYnV0ZSgodmlzaWJpbGl0eSgiaGlkZGVuIikpKTsKKyNkZWZpbmUgeG1sRmlyc3RFbGVtZW50Q2hpbGQgeG1sRmlyc3RFbGVtZW50Q2hpbGRfX2ludGVybmFsX2FsaWFzCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKICNpZmRlZiBib3R0b21fdmFsaWQKICN1bmRlZiB4bWxGcmVlQXR0cmlidXRlVGFibGUKIGV4dGVybiBfX3R5cGVvZiAoeG1sRnJlZUF0dHJpYnV0ZVRhYmxlKSB4bWxGcmVlQXR0cmlidXRlVGFibGUgX19hdHRyaWJ1dGUoKGFsaWFzKCJ4bWxGcmVlQXR0cmlidXRlVGFibGVfX2ludGVybmFsX2FsaWFzIikpKTsKQEAgLTQ3NTksNiArNDc4MywxOCBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKKyNpZmRlZiBib3R0b21fdHJlZQorI3VuZGVmIHhtbExhc3RFbGVtZW50Q2hpbGQKK2V4dGVybiBfX3R5cGVvZiAoeG1sTGFzdEVsZW1lbnRDaGlsZCkgeG1sTGFzdEVsZW1lbnRDaGlsZCBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbExhc3RFbGVtZW50Q2hpbGRfX2ludGVybmFsX2FsaWFzIikpKTsKKyNlbHNlCisjaWZuZGVmIHhtbExhc3RFbGVtZW50Q2hpbGQKK2V4dGVybiBfX3R5cGVvZiAoeG1sTGFzdEVsZW1lbnRDaGlsZCkgeG1sTGFzdEVsZW1lbnRDaGlsZF9faW50ZXJuYWxfYWxpYXMgX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisjZGVmaW5lIHhtbExhc3RFbGVtZW50Q2hpbGQgeG1sTGFzdEVsZW1lbnRDaGlsZF9faW50ZXJuYWxfYWxpYXMKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKwogI2lmZGVmIGJvdHRvbV9wYXJzZXJJbnRlcm5hbHMKICN1bmRlZiB4bWxMaW5lTnVtYmVyc0RlZmF1bHQKIGV4dGVybiBfX3R5cGVvZiAoeG1sTGluZU51bWJlcnNEZWZhdWx0KSB4bWxMaW5lTnVtYmVyc0RlZmF1bHQgX19hdHRyaWJ1dGUoKGFsaWFzKCJ4bWxMaW5lTnVtYmVyc0RlZmF1bHRfX2ludGVybmFsX2FsaWFzIikpKTsKQEAgLTUxNjIsNiArNTE5OCwxNiBAQAogI2VuZGlmCiAKICNpZmRlZiBib3R0b21feG1sbWVtb3J5CisjdW5kZWYgeG1sTWVtRGlzcGxheUxhc3QKK2V4dGVybiBfX3R5cGVvZiAoeG1sTWVtRGlzcGxheUxhc3QpIHhtbE1lbURpc3BsYXlMYXN0IF9fYXR0cmlidXRlKChhbGlhcygieG1sTWVtRGlzcGxheUxhc3RfX2ludGVybmFsX2FsaWFzIikpKTsKKyNlbHNlCisjaWZuZGVmIHhtbE1lbURpc3BsYXlMYXN0CitleHRlcm4gX190eXBlb2YgKHhtbE1lbURpc3BsYXlMYXN0KSB4bWxNZW1EaXNwbGF5TGFzdF9faW50ZXJuYWxfYWxpYXMgX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisjZGVmaW5lIHhtbE1lbURpc3BsYXlMYXN0IHhtbE1lbURpc3BsYXlMYXN0X19pbnRlcm5hbF9hbGlhcworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIGJvdHRvbV94bWxtZW1vcnkKICN1bmRlZiB4bWxNZW1GcmVlCiBleHRlcm4gX190eXBlb2YgKHhtbE1lbUZyZWUpIHhtbE1lbUZyZWUgX19hdHRyaWJ1dGUoKGFsaWFzKCJ4bWxNZW1GcmVlX19pbnRlcm5hbF9hbGlhcyIpKSk7CiAjZWxzZQpAQCAtNjA0Myw2ICs2MDg5LDE2IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWZkZWYgYm90dG9tX2VudGl0aWVzCisjdW5kZWYgeG1sTmV3RW50aXR5CitleHRlcm4gX190eXBlb2YgKHhtbE5ld0VudGl0eSkgeG1sTmV3RW50aXR5IF9fYXR0cmlidXRlKChhbGlhcygieG1sTmV3RW50aXR5X19pbnRlcm5hbF9hbGlhcyIpKSk7CisjZWxzZQorI2lmbmRlZiB4bWxOZXdFbnRpdHkKK2V4dGVybiBfX3R5cGVvZiAoeG1sTmV3RW50aXR5KSB4bWxOZXdFbnRpdHlfX2ludGVybmFsX2FsaWFzIF9fYXR0cmlidXRlKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpOworI2RlZmluZSB4bWxOZXdFbnRpdHkgeG1sTmV3RW50aXR5X19pbnRlcm5hbF9hbGlhcworI2VuZGlmCisjZW5kaWYKKwogI2lmZGVmIGJvdHRvbV9wYXJzZXJJbnRlcm5hbHMKICN1bmRlZiB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbQogZXh0ZXJuIF9fdHlwZW9mICh4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbSkgeG1sTmV3RW50aXR5SW5wdXRTdHJlYW0gX19hdHRyaWJ1dGUoKGFsaWFzKCJ4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbV9faW50ZXJuYWxfYWxpYXMiKSkpOwpAQCAtNjM2Nyw2ICs2NDIzLDE4IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQorI2lmZGVmIGJvdHRvbV90cmVlCisjdW5kZWYgeG1sTmV4dEVsZW1lbnRTaWJsaW5nCitleHRlcm4gX190eXBlb2YgKHhtbE5leHRFbGVtZW50U2libGluZykgeG1sTmV4dEVsZW1lbnRTaWJsaW5nIF9fYXR0cmlidXRlKChhbGlhcygieG1sTmV4dEVsZW1lbnRTaWJsaW5nX19pbnRlcm5hbF9hbGlhcyIpKSk7CisjZWxzZQorI2lmbmRlZiB4bWxOZXh0RWxlbWVudFNpYmxpbmcKK2V4dGVybiBfX3R5cGVvZiAoeG1sTmV4dEVsZW1lbnRTaWJsaW5nKSB4bWxOZXh0RWxlbWVudFNpYmxpbmdfX2ludGVybmFsX2FsaWFzIF9fYXR0cmlidXRlKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpOworI2RlZmluZSB4bWxOZXh0RWxlbWVudFNpYmxpbmcgeG1sTmV4dEVsZW1lbnRTaWJsaW5nX19pbnRlcm5hbF9hbGlhcworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCiAjaWZkZWYgYm90dG9tX3htbElPCiAjdW5kZWYgeG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlcgogZXh0ZXJuIF9fdHlwZW9mICh4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKSB4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyIF9fYXR0cmlidXRlKChhbGlhcygieG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlcl9faW50ZXJuYWxfYWxpYXMiKSkpOwpAQCAtNzc2OSw2ICs3ODM3LDE4IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQorI2lmZGVmIGJvdHRvbV90cmVlCisjdW5kZWYgeG1sUHJldmlvdXNFbGVtZW50U2libGluZworZXh0ZXJuIF9fdHlwZW9mICh4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nIF9fYXR0cmlidXRlKChhbGlhcygieG1sUHJldmlvdXNFbGVtZW50U2libGluZ19faW50ZXJuYWxfYWxpYXMiKSkpOworI2Vsc2UKKyNpZm5kZWYgeG1sUHJldmlvdXNFbGVtZW50U2libGluZworZXh0ZXJuIF9fdHlwZW9mICh4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nX19pbnRlcm5hbF9hbGlhcyBfX2F0dHJpYnV0ZSgodmlzaWJpbGl0eSgiaGlkZGVuIikpKTsKKyNkZWZpbmUgeG1sUHJldmlvdXNFbGVtZW50U2libGluZyB4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nX19pbnRlcm5hbF9hbGlhcworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCiAjaWZkZWYgYm90dG9tX3VyaQogI3VuZGVmIHhtbFByaW50VVJJCiBleHRlcm4gX190eXBlb2YgKHhtbFByaW50VVJJKSB4bWxQcmludFVSSSBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbFByaW50VVJJX19pbnRlcm5hbF9hbGlhcyIpKSk7CkBAIC05ODQzLDYgKzk5MjMsMTggQEAKIAogI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICNpZmRlZiBib3R0b21feG1sc2NoZW1hcworI3VuZGVmIHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQKK2V4dGVybiBfX3R5cGVvZiAoeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dCkgeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dCBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHRfX2ludGVybmFsX2FsaWFzIikpKTsKKyNlbHNlCisjaWZuZGVmIHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQKK2V4dGVybiBfX3R5cGVvZiAoeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dCkgeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dF9faW50ZXJuYWxfYWxpYXMgX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisjZGVmaW5lIHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQgeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dF9faW50ZXJuYWxfYWxpYXMKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKKyNpZmRlZiBib3R0b21feG1sc2NoZW1hcwogI3VuZGVmIHhtbFNjaGVtYVZhbGlkYXRlRG9jCiBleHRlcm4gX190eXBlb2YgKHhtbFNjaGVtYVZhbGlkYXRlRG9jKSB4bWxTY2hlbWFWYWxpZGF0ZURvYyBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbFNjaGVtYVZhbGlkYXRlRG9jX19pbnRlcm5hbF9hbGlhcyIpKSk7CiAjZWxzZQpAQCAtMTAxMTksNiArMTAyMTEsMTggQEAKIAogI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVRST05fRU5BQkxFRCkKICNpZmRlZiBib3R0b21fc2NoZW1hdHJvbgorI3VuZGVmIHhtbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnMKK2V4dGVybiBfX3R5cGVvZiAoeG1sU2NoZW1hdHJvblNldFZhbGlkU3RydWN0dXJlZEVycm9ycykgeG1sU2NoZW1hdHJvblNldFZhbGlkU3RydWN0dXJlZEVycm9ycyBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnNfX2ludGVybmFsX2FsaWFzIikpKTsKKyNlbHNlCisjaWZuZGVmIHhtbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnMKK2V4dGVybiBfX3R5cGVvZiAoeG1sU2NoZW1hdHJvblNldFZhbGlkU3RydWN0dXJlZEVycm9ycykgeG1sU2NoZW1hdHJvblNldFZhbGlkU3RydWN0dXJlZEVycm9yc19faW50ZXJuYWxfYWxpYXMgX19hdHRyaWJ1dGUoKHZpc2liaWxpdHkoImhpZGRlbiIpKSk7CisjZGVmaW5lIHhtbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnMgeG1sU2NoZW1hdHJvblNldFZhbGlkU3RydWN0dXJlZEVycm9yc19faW50ZXJuYWxfYWxpYXMKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVRST05fRU5BQkxFRCkKKyNpZmRlZiBib3R0b21fc2NoZW1hdHJvbgogI3VuZGVmIHhtbFNjaGVtYXRyb25WYWxpZGF0ZURvYwogZXh0ZXJuIF9fdHlwZW9mICh4bWxTY2hlbWF0cm9uVmFsaWRhdGVEb2MpIHhtbFNjaGVtYXRyb25WYWxpZGF0ZURvYyBfX2F0dHJpYnV0ZSgoYWxpYXMoInhtbFNjaGVtYXRyb25WYWxpZGF0ZURvY19faW50ZXJuYWxfYWxpYXMiKSkpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2VuY29kaW5nLmMgYi9lbmNvZGluZy5jCmluZGV4IDAwMmVlYmEuLmUyZGY3OTcgMTAwNjQ0Ci0tLSBhL2VuY29kaW5nLmMKKysrIGIvZW5jb2RpbmcuYwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKICAgICB9CiAgICAgaWN2X2lubGVuID0gKmlubGVuOwogICAgIGljdl9vdXRsZW4gPSAqb3V0bGVuOwotICAgIHJldCA9IGljb252KGNkLCAoY2hhciAqKikgJmljdl9pbiwgJmljdl9pbmxlbiwgJmljdl9vdXQsICZpY3Zfb3V0bGVuKTsKKyAgICByZXQgPSBpY29udihjZCwgKElDT05WX0NPTlNUIGNoYXIgKiopICZpY3ZfaW4sICZpY3ZfaW5sZW4sICZpY3Zfb3V0LCAmaWN2X291dGxlbik7CiAgICAgKmlubGVuIC09IGljdl9pbmxlbjsKICAgICAqb3V0bGVuIC09IGljdl9vdXRsZW47CiAgICAgaWYgKChpY3ZfaW5sZW4gIT0gMCkgfHwgKHJldCA9PSAtMSkpIHsKQEAgLTE3NjgsOSArMTc2OCwxMCBAQAogICAgICAqIGVjaG8gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVDUzQiPz4nIHwgd2MgLWMgPT4gMzgKICAgICAgKiA0NSBjaGFycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byByZWFjaCB0aGUgZW5kIG9mIHRoZSBlbmNvZGluZwogICAgICAqIGRlY2xhcmF0aW9uIHdpdGhvdXQgZ29pbmcgdG9vIGZhciBpbnNpZGUgdGhlIGRvY3VtZW50IGNvbnRlbnQuCisgICAgICogb24gVVRGLTE2IHRoaXMgbWVhbnMgOTBieXRlcywgb24gVUNTNCB0aGlzIG1lYW5zIDE4MAogICAgICAqLwotICAgIGlmICh0b2NvbnYgPiA0NSkKLQl0b2NvbnYgID0gNDU7CisgICAgaWYgKHRvY29udiA+IDE4MCkKKwl0b2NvbnYgID0gMTgwOwogICAgIGlmICh0b2NvbnYgKiAyID49IHdyaXR0ZW4pIHsKICAgICAgICAgeG1sQnVmZmVyR3JvdyhvdXQsIHRvY29udik7CiAJd3JpdHRlbiA9IG91dC0+c2l6ZSAtIG91dC0+dXNlIC0gMTsKQEAgLTE5OTEsMTYgKzE5OTIsMTggQEAKICAgICB0b2NvbnYgPSBpbi0+dXNlOwogICAgIGlmICh0b2NvbnYgPT0gMCkKIAlyZXR1cm4oMCk7Ci0gICAgaWYgKHRvY29udiAqIDIgPj0gd3JpdHRlbikgewotICAgICAgICB4bWxCdWZmZXJHcm93KG91dCwgdG9jb252ICogMik7CisgICAgaWYgKHRvY29udiAqIDQgPj0gd3JpdHRlbikgeworICAgICAgICB4bWxCdWZmZXJHcm93KG91dCwgdG9jb252ICogNCk7CiAJd3JpdHRlbiA9IG91dC0+c2l6ZSAtIG91dC0+dXNlIC0gMTsKICAgICB9CiAgICAgaWYgKGhhbmRsZXItPm91dHB1dCAhPSBOVUxMKSB7CiAJcmV0ID0gaGFuZGxlci0+b3V0cHV0KCZvdXQtPmNvbnRlbnRbb3V0LT51c2VdLCAmd3JpdHRlbiwKIAkgICAgICAgICAgICAgICAgICAgICAgaW4tPmNvbnRlbnQsICZ0b2NvbnYpOwotCXhtbEJ1ZmZlclNocmluayhpbiwgdG9jb252KTsKLQlvdXQtPnVzZSArPSB3cml0dGVuOwotCXdyaXR0ZW50b3QgKz0gd3JpdHRlbjsKKwlpZiAod3JpdHRlbiA+IDApIHsKKwkgICAgeG1sQnVmZmVyU2hyaW5rKGluLCB0b2NvbnYpOworCSAgICBvdXQtPnVzZSArPSB3cml0dGVuOworCSAgICB3cml0dGVudG90ICs9IHdyaXR0ZW47CisJfSAKIAlvdXQtPmNvbnRlbnRbb3V0LT51c2VdID0gMDsKICAgICB9CiAjaWZkZWYgTElCWE1MX0lDT05WX0VOQUJMRUQKZGlmZiAtLWdpdCBhL2VudGl0aWVzLmMgYi9lbnRpdGllcy5jCmluZGV4IDkxYTM5NzguLmMxNzFlOTcgMTAwNjQ0Ci0tLSBhL2VudGl0aWVzLmMKKysrIGIvZW50aXRpZXMuYwpAQCAtMTM5LDQ1ICsxMzksMTkgQEAKIH0KIAogLyoKLSAqIHhtbEFkZEVudGl0eSA6IHJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgYW4gZW50aXRpZXMgdGFibGUuCisgKiB4bWxDcmVhdGVFbnRpdHk6CisgKgorICogaW50ZXJuYWwgcm91dGluZSBkb2luZyB0aGUgZW50aXR5IG5vZGUgc3RydXR1cmVzIGFsbG9jYXRpb25zCiAgKi8KIHN0YXRpYyB4bWxFbnRpdHlQdHIKLXhtbEFkZEVudGl0eSh4bWxEdGRQdHIgZHRkLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKLQkgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAotCSAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgewotICAgIHhtbERpY3RQdHIgZGljdCA9IE5VTEw7Ci0gICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSA9IE5VTEw7Cit4bWxDcmVhdGVFbnRpdHkoeG1sRGljdFB0ciBkaWN0LCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKKwkgICAgICAgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAorCSAgICAgICAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgewogICAgIHhtbEVudGl0eVB0ciByZXQ7CiAKLSAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybihOVUxMKTsKLSAgICBpZiAoZHRkID09IE5VTEwpCi0JcmV0dXJuKE5VTEwpOwotICAgIGlmIChkdGQtPmRvYyAhPSBOVUxMKQotICAgICAgICBkaWN0ID0gZHRkLT5kb2MtPmRpY3Q7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6Ci0gICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWToKLSAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9VTlBBUlNFRF9FTlRJVFk6Ci0JICAgIGlmIChkdGQtPmVudGl0aWVzID09IE5VTEwpCi0JCWR0ZC0+ZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlRGljdCgwLCBkaWN0KTsKLQkgICAgdGFibGUgPSBkdGQtPmVudGl0aWVzOwotCSAgICBicmVhazsKLSAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKLSAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKLQkgICAgaWYgKGR0ZC0+cGVudGl0aWVzID09IE5VTEwpCi0JCWR0ZC0+cGVudGl0aWVzID0geG1sSGFzaENyZWF0ZURpY3QoMCwgZGljdCk7Ci0JICAgIHRhYmxlID0gZHRkLT5wZW50aXRpZXM7Ci0JICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKLQkgICAgcmV0dXJuKE5VTEwpOwotICAgIH0KLSAgICBpZiAodGFibGUgPT0gTlVMTCkKLQlyZXR1cm4oTlVMTCk7CiAgICAgcmV0ID0gKHhtbEVudGl0eVB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdHkpKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgICAgeG1sRW50aXRpZXNFcnJNZW1vcnkoInhtbEFkZEVudGl0eTo6IG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgeG1sRW50aXRpZXNFcnJNZW1vcnkoInhtbENyZWF0ZUVudGl0eTogbWFsbG9jIGZhaWxlZCIpOwogCXJldHVybihOVUxMKTsKICAgICB9CiAgICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKHhtbEVudGl0eSkpOwpAQCAtMjE2LDYgKzE5MCw1MCBAQAogCQkJdGhlIGRlZmluaW5nIGVudGl0eSAqLwogICAgIHJldC0+b3JpZyA9IE5VTEw7CiAgICAgcmV0LT5vd25lciA9IDA7CisKKyAgICByZXR1cm4ocmV0KTsKK30KKworLyoKKyAqIHhtbEFkZEVudGl0eSA6IHJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgYW4gZW50aXRpZXMgdGFibGUuCisgKi8KK3N0YXRpYyB4bWxFbnRpdHlQdHIKK3htbEFkZEVudGl0eSh4bWxEdGRQdHIgZHRkLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKKwkgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAorCSAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgeworICAgIHhtbERpY3RQdHIgZGljdCA9IE5VTEw7CisgICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSA9IE5VTEw7CisgICAgeG1sRW50aXR5UHRyIHJldDsKKworICAgIGlmIChuYW1lID09IE5VTEwpCisJcmV0dXJuKE5VTEwpOworICAgIGlmIChkdGQgPT0gTlVMTCkKKwlyZXR1cm4oTlVMTCk7CisgICAgaWYgKGR0ZC0+ZG9jICE9IE5VTEwpCisgICAgICAgIGRpY3QgPSBkdGQtPmRvYy0+ZGljdDsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9HRU5FUkFMX0VOVElUWToKKyAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgorICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWToKKwkgICAgaWYgKGR0ZC0+ZW50aXRpZXMgPT0gTlVMTCkKKwkJZHRkLT5lbnRpdGllcyA9IHhtbEhhc2hDcmVhdGVEaWN0KDAsIGRpY3QpOworCSAgICB0YWJsZSA9IGR0ZC0+ZW50aXRpZXM7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorICAgICAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorCSAgICBpZiAoZHRkLT5wZW50aXRpZXMgPT0gTlVMTCkKKwkJZHRkLT5wZW50aXRpZXMgPSB4bWxIYXNoQ3JlYXRlRGljdCgwLCBkaWN0KTsKKwkgICAgdGFibGUgPSBkdGQtPnBlbnRpdGllczsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZOgorCSAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmICh0YWJsZSA9PSBOVUxMKQorCXJldHVybihOVUxMKTsKKyAgICByZXQgPSB4bWxDcmVhdGVFbnRpdHkoZGljdCwgbmFtZSwgdHlwZSwgRXh0ZXJuYWxJRCwgU3lzdGVtSUQsIGNvbnRlbnQpOworICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIHJldC0+ZG9jID0gZHRkLT5kb2M7CiAKICAgICBpZiAoeG1sSGFzaEFkZEVudHJ5KHRhYmxlLCBuYW1lLCByZXQpKSB7CkBAIC0zNjMsNiArMzgxLDQ0IEBACiB9CiAKIC8qKgorICogeG1sTmV3RW50aXR5OgorICogQGRvYzogIHRoZSBkb2N1bWVudAorICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKKyAqIEB0eXBlOiAgdGhlIGVudGl0eSB0eXBlIFhNTF94eHhfeXl5X0VOVElUWQorICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQorICogQFN5c3RlbUlEOiAgdGhlIGVudGl0eSBzeXN0ZW0gSUQgaWYgYXZhaWxhYmxlCisgKiBAY29udGVudDogIHRoZSBlbnRpdHkgY29udGVudAorICoKKyAqIENyZWF0ZSBhIG5ldyBlbnRpdHksIHRoaXMgZGlmZmVycyBmcm9tIHhtbEFkZERvY0VudGl0eSgpIHRoYXQgaWYKKyAqIHRoZSBkb2N1bWVudCBpcyBOVUxMIG9yIGhhcyBubyBpbnRlcm5hbCBzdWJzZXQgZGVmaW5lZCwgdGhlbiBhbgorICogdW5saW5rZWQgZW50aXR5IHN0cnVjdHVyZSB3aWxsIGJlIHJldHVybmVkLCBpdCBpcyB0aGVuIHRoZSByZXNwb25zYWJpbGl0eQorICogb2YgdGhlIGNhbGxlciB0byBsaW5rIGl0IHRvIHRoZSBkb2N1bWVudCBsYXRlciBvciBmcmVlIGl0IHdoZW4gbm90IG5lZWRlZAorICogYW55bW9yZS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgorICovCit4bWxFbnRpdHlQdHIKK3htbE5ld0VudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKKwkgICAgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAorCSAgICAgY29uc3QgeG1sQ2hhciAqY29udGVudCkgeworICAgIHhtbEVudGl0eVB0ciByZXQ7CisgICAgeG1sRGljdFB0ciBkaWN0OworCisgICAgaWYgKChkb2MgIT0gTlVMTCkgJiYgKGRvYy0+aW50U3Vic2V0ICE9IE5VTEwpKSB7CisJcmV0dXJuKHhtbEFkZERvY0VudGl0eShkb2MsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KSk7CisgICAgfQorICAgIGlmIChkb2MgIT0gTlVMTCkKKyAgICAgICAgZGljdCA9IGRvYy0+ZGljdDsKKyAgICBlbHNlCisgICAgICAgIGRpY3QgPSBOVUxMOworICAgIHJldCA9IHhtbENyZWF0ZUVudGl0eShkaWN0LCBuYW1lLCB0eXBlLCBFeHRlcm5hbElELCBTeXN0ZW1JRCwgY29udGVudCk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgcmV0LT5kb2MgPSBkb2M7CisgICAgcmV0dXJuKHJldCk7Cit9CisKKy8qKgogICogeG1sR2V0RW50aXR5RnJvbVRhYmxlOgogICogQHRhYmxlOiAgYW4gZW50aXR5IHRhYmxlCiAgKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQpkaWZmIC0tZ2l0IGEvZXJyb3IuYyBiL2Vycm9yLmMKaW5kZXggNzIyZmZiYi4uNWYwM2Q5NCAxMDA2NDQKLS0tIGEvZXJyb3IuYworKysgYi9lcnJvci5jCkBAIC0zMSw3ICszMSw3IEBACiAJCQkJCQkJCVwKICAgICBzaXplID0gMTUwOwkJCQkJCQlcCiAJCQkJCQkJCVwKLSAgICB3aGlsZSAoMSkgewkJCQkJCQlcCisgICAgd2hpbGUgKHNpemUgPCA2NDAwMCkgewkJCQkJXAogCXZhX3N0YXJ0KGFwLCBtc2cpOwkJCQkJXAogICAJY2hhcnMgPSB2c25wcmludGYoc3RyLCBzaXplLCBtc2csIGFwKTsJCQlcCiAJdmFfZW5kKGFwKTsJCQkJCQlcCmRpZmYgLS1naXQgYS9nbG9iYWxzLmMgYi9nbG9iYWxzLmMKaW5kZXggNjM2ZmY4Ny4uY2JjNjYyNSAxMDA2NDQKLS0tIGEvZ2xvYmFscy5jCisrKyBiL2dsb2JhbHMuYwpAQCAtNjAsNyArNjAsNyBAQAogCXhtbEZyZWVNdXRleCh4bWxUaHJEZWZNdXRleCk7CiAJeG1sVGhyRGVmTXV0ZXggPSBOVUxMOwogICAgIH0KLQlfX3htbEdsb2JhbEluaXRNdXRleERlc3Ryb3koKTsKKyAgICBfX3htbEdsb2JhbEluaXRNdXRleERlc3Ryb3koKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwvYzE0bi5oIGIvaW5jbHVkZS9saWJ4bWwvYzE0bi5oCmluZGV4IDlmNGM2YzAuLmE4YWE3MzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlieG1sL2MxNG4uaAorKysgYi9pbmNsdWRlL2xpYnhtbC9jMTRuLmgKQEAgLTIsMzAgKzIsMzAgQEAKICAqIFN1bW1hcnk6IFByb3ZpZGUgQ2Fub25pY2FsIFhNTCBhbmQgRXhjbHVzaXZlIFhNTCBDYW5vbmljYWxpemF0aW9uCiAgKiBEZXNjcmlwdGlvbjogdGhlIGMxNG4gbW9kdWxlcyBwcm92aWRlcyBhCiAgKgotICogIkNhbm9uaWNhbCBYTUwiIGltcGxlbWVudGF0aW9uIAorICogIkNhbm9uaWNhbCBYTUwiIGltcGxlbWVudGF0aW9uCiAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtYzE0bgotICogCisgKgogICogYW5kIGFuCiAgKgogICogIkV4Y2x1c2l2ZSBYTUwgQ2Fub25pY2FsaXphdGlvbiIgaW1wbGVtZW50YXRpb24KICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1leGMtYzE0bgotIAorCiAgKiBDb3B5OiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCi0gKiAKKyAqCiAgKiBBdXRob3I6IEFsZWtzZXkgU2FuaW4gPGFsZWtzZXlAYWxla3NleS5jb20+CiAgKi8KICNpZm5kZWYgX19YTUxfQzE0Tl9IX18KLSNkZWZpbmUgX19YTUxfQzE0Tl9IX18gICAgCisjZGVmaW5lIF9fWE1MX0MxNE5fSF9fCiAjaWZkZWYgTElCWE1MX0MxNE5fRU5BQkxFRAogI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovIAorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNpbmNsdWRlIDxsaWJ4bWwveG1sdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+Ci0jaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+IAorI2luY2x1ZGUgPGxpYnhtbC94cGF0aC5oPgogCiAvKgogICogWE1MIENhbm9uaWNhemF0aW9uCkBAIC0zNywyOCArMzcsMjggQEAKICAqIENhbm9uaWNhbCBmb3JtIG9mIGFuIFhNTCBkb2N1bWVudCBjb3VsZCBiZSBjcmVhdGVkIGlmIGFuZCBvbmx5IGlmCiAgKiAgYSkgZGVmYXVsdCBhdHRyaWJ1dGVzIChpZiBhbnkpIGFyZSBhZGRlZCB0byBhbGwgbm9kZXMKICAqICBiKSBhbGwgY2hhcmFjdGVyIGFuZCBwYXJzZWQgZW50aXR5IHJlZmVyZW5jZXMgYXJlIHJlc29sdmVkCi0gKiBJbiBvcmRlciB0byBhY2hpdmUgdGhpcyBpbiBsaWJ4bWwyIHRoZSBkb2N1bWVudCBNVVNUIGJlIGxvYWRlZCB3aXRoIAorICogSW4gb3JkZXIgdG8gYWNoaXZlIHRoaXMgaW4gbGlieG1sMiB0aGUgZG9jdW1lbnQgTVVTVCBiZSBsb2FkZWQgd2l0aAogICogZm9sbG93aW5nIGdsb2JhbCBzZXRpbmdzOgotICogICAgCisgKgogICogICAgeG1sTG9hZEV4dER0ZERlZmF1bHRWYWx1ZSA9IFhNTF9ERVRFQ1RfSURTIHwgWE1MX0NPTVBMRVRFX0FUVFJTOwogICogICAgeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCgxKTsKICAqCiAgKiBvciBjb3JyZXNwb25kaW5nIHBhcnNlciBjb250ZXh0IHNldHRpbmc6CiAgKiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7Ci0gKiAgICAKLSAqICAgIC4uLiAKKyAqCisgKiAgICAuLi4KICAqICAgIGN0eHQtPmxvYWRzdWJzZXQgPSBYTUxfREVURUNUX0lEUyB8IFhNTF9DT01QTEVURV9BVFRSUzsKICAqICAgIGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9IDE7CiAgKiAgICAuLi4KICAqLwogCiAKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTCAJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCXhtbEMxNE5Eb2NTYXZlVG8JKHhtbERvY1B0ciBkb2MsCiAJCQkJCSB4bWxOb2RlU2V0UHRyIG5vZGVzLAogCQkJCQkgaW50IGV4Y2x1c2l2ZSwKIAkJCQkJIHhtbENoYXIgKippbmNsdXNpdmVfbnNfcHJlZml4ZXMsCi0JCQkJCSBpbnQgd2l0aF9jb21tZW50cywgCisJCQkJCSBpbnQgd2l0aF9jb21tZW50cywKIAkJCQkJIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYpOwogCiBYTUxQVUJGVU4gaW50IFhNTENBTEwKQEAgLTY2LDcgKzY2LDcgQEAKIAkJCQkJIHhtbE5vZGVTZXRQdHIgbm9kZXMsCiAJCQkJCSBpbnQgZXhjbHVzaXZlLAogCQkJCQkgeG1sQ2hhciAqKmluY2x1c2l2ZV9uc19wcmVmaXhlcywKLQkJCQkJIGludCB3aXRoX2NvbW1lbnRzLCAKKwkJCQkJIGludCB3aXRoX2NvbW1lbnRzLAogCQkJCQkgeG1sQ2hhciAqKmRvY190eHRfcHRyKTsKIAogWE1MUFVCRlVOIGludCBYTUxDQUxMCkBAIC03NCw3ICs3NCw3IEBACiAJCQkJCSB4bWxOb2RlU2V0UHRyIG5vZGVzLAogCQkJCQkgaW50IGV4Y2x1c2l2ZSwKIAkJCQkJIHhtbENoYXIgKippbmNsdXNpdmVfbnNfcHJlZml4ZXMsCi0JCQkJCSBpbnQgd2l0aF9jb21tZW50cywgCisJCQkJCSBpbnQgd2l0aF9jb21tZW50cywKIAkJCQkJIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAogCQkJCQkgaW50IGNvbXByZXNzaW9uKTsKIApAQCAtODIsMTcgKzgyLDI3IEBACiAvKioKICAqIFRoaXMgaXMgdGhlIGNvcmUgQzE0TiBmdW5jdGlvbgogICovCi10eXBlZGVmIGludCAoKnhtbEMxNE5Jc1Zpc2libGVDYWxsYmFjaykJKHZvaWQqIHVzZXJfZGF0YSwgCisvKioKKyAqIHhtbEMxNE5Jc1Zpc2libGVDYWxsYmFjazoKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YQorICogQG5vZGU6IHRoZSBjdXJlbnQgbm9kZQorICogQHBhcmVudDogdGhlIHBhcmVudCBub2RlCisgKgorICogU2lnbmF0dXJlIGZvciBhIEMxNE4gY2FsbGJhY2sgb24gdmlzaWJsZSBub2RlcworICoKKyAqIFJldHVybnMgMSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgaW5jbHVkZWQKKyAqLwordHlwZWRlZiBpbnQgKCp4bWxDMTROSXNWaXNpYmxlQ2FsbGJhY2spCSh2b2lkKiB1c2VyX2RhdGEsCiAJCQkJCSB4bWxOb2RlUHRyIG5vZGUsCiAJCQkJCSB4bWxOb2RlUHRyIHBhcmVudCk7CiAKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQl4bWxDMTRORXhlY3V0ZQkJKHhtbERvY1B0ciBkb2MsCiAJCQkJCSB4bWxDMTROSXNWaXNpYmxlQ2FsbGJhY2sgaXNfdmlzaWJsZV9jYWxsYmFjaywKLQkJCQkJIHZvaWQqIHVzZXJfZGF0YSwJCQkJIAorCQkJCQkgdm9pZCogdXNlcl9kYXRhLAogCQkJCQkgaW50IGV4Y2x1c2l2ZSwKIAkJCQkJIHhtbENoYXIgKippbmNsdXNpdmVfbnNfcHJlZml4ZXMsCi0JCQkJCSBpbnQgd2l0aF9jb21tZW50cywgCisJCQkJCSBpbnQgd2l0aF9jb21tZW50cywKIAkJCQkJIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL2VudGl0aWVzLmggYi9pbmNsdWRlL2xpYnhtbC9lbnRpdGllcy5oCmluZGV4IGZkZDcyMjIuLmNlZmI5N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlieG1sL2VudGl0aWVzLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvZW50aXRpZXMuaApAQCAtNTcsNiArNTcsOCBAQAogICAgIGNvbnN0IHhtbENoYXIgICAgICAgICAgICpVUkk7CS8qIHRoZSBmdWxsIFVSSSBhcyBjb21wdXRlZCAqLwogICAgIGludCAgICAgICAgICAgICAgICAgICAgb3duZXI7CS8qIGRvZXMgdGhlIGVudGl0eSBvd24gdGhlIGNoaWxkcmVucyAqLwogICAgIGludAkJCSBjaGVja2VkOwkvKiB3YXMgdGhlIGVudGl0eSBjb250ZW50IGNoZWNrZWQgKi8KKwkJCQkJLyogdGhpcyBpcyBhbHNvIHVzZWQgdG8gY291bnQgZW50aXRlcworCQkJCQkgKiByZWZlcmVuY2VzIGRvbmUgZnJvbSB0aGF0IGVudGl0eSAqLwogfTsKIAogLyoKQEAgLTcyLDkgKzc0LDE3IEBACiAgKi8KIAogI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCXhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMJKHZvaWQpOwogI2VuZGlmIC8qIExJQlhNTF9MRUdBQ1lfRU5BQkxFRCAqLworCitYTUxQVUJGVU4geG1sRW50aXR5UHRyIFhNTENBTEwKKwkJCXhtbE5ld0VudGl0eQkJKHhtbERvY1B0ciBkb2MsCisJCQkJCQkgY29uc3QgeG1sQ2hhciAqbmFtZSwKKwkJCQkJCSBpbnQgdHlwZSwKKwkJCQkJCSBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELAorCQkJCQkJIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAorCQkJCQkJIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpOwogWE1MUFVCRlVOIHhtbEVudGl0eVB0ciBYTUxDQUxMCiAJCQl4bWxBZGREb2NFbnRpdHkJCSh4bWxEb2NQdHIgZG9jLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKm5hbWUsCkBAIC04Miw1MyArOTIsNTMgQEAKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpFeHRlcm5hbElELAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlELAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpOwotWE1MUFVCRlVOIHhtbEVudGl0eVB0ciBYTUxDQUxMCQkKK1hNTFBVQkZVTiB4bWxFbnRpdHlQdHIgWE1MQ0FMTAogCQkJeG1sQWRkRHRkRW50aXR5CQkoeG1sRG9jUHRyIGRvYywKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpuYW1lLAogCQkJCQkJIGludCB0eXBlLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqY29udGVudCk7Ci1YTUxQVUJGVU4geG1sRW50aXR5UHRyIFhNTENBTEwJCQorWE1MUFVCRlVOIHhtbEVudGl0eVB0ciBYTUxDQUxMCiAJCQl4bWxHZXRQcmVkZWZpbmVkRW50aXR5CShjb25zdCB4bWxDaGFyICpuYW1lKTsKLVhNTFBVQkZVTiB4bWxFbnRpdHlQdHIgWE1MQ0FMTAkJCitYTUxQVUJGVU4geG1sRW50aXR5UHRyIFhNTENBTEwKIAkJCXhtbEdldERvY0VudGl0eQkJKHhtbERvY1B0ciBkb2MsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqbmFtZSk7Ci1YTUxQVUJGVU4geG1sRW50aXR5UHRyIFhNTENBTEwJCQorWE1MUFVCRlVOIHhtbEVudGl0eVB0ciBYTUxDQUxMCiAJCQl4bWxHZXREdGRFbnRpdHkJCSh4bWxEb2NQdHIgZG9jLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKm5hbWUpOwotWE1MUFVCRlVOIHhtbEVudGl0eVB0ciBYTUxDQUxMCQkKK1hNTFBVQkZVTiB4bWxFbnRpdHlQdHIgWE1MQ0FMTAogCQkJeG1sR2V0UGFyYW1ldGVyRW50aXR5CSh4bWxEb2NQdHIgZG9jLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKm5hbWUpOwogI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQkKK1hNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sRW5jb2RlRW50aXRpZXMJKHhtbERvY1B0ciBkb2MsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqaW5wdXQpOwogI2VuZGlmIC8qIExJQlhNTF9MRUdBQ1lfRU5BQkxFRCAqLwotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCQkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoeG1sRG9jUHRyIGRvYywKIAkJCQkJCSBjb25zdCB4bWxDaGFyICppbnB1dCk7Ci1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCQorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCQl4bWxFbmNvZGVTcGVjaWFsQ2hhcnMJKHhtbERvY1B0ciBkb2MsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqaW5wdXQpOwotWE1MUFVCRlVOIHhtbEVudGl0aWVzVGFibGVQdHIgWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxFbnRpdGllc1RhYmxlUHRyIFhNTENBTEwKIAkJCXhtbENyZWF0ZUVudGl0aWVzVGFibGUJKHZvaWQpOwogI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKLVhNTFBVQkZVTiB4bWxFbnRpdGllc1RhYmxlUHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sRW50aXRpZXNUYWJsZVB0ciBYTUxDQUxMCiAJCQl4bWxDb3B5RW50aXRpZXNUYWJsZQkoeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSk7CiAjZW5kaWYgLyogTElCWE1MX1RSRUVfRU5BQkxFRCAqLwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkJeG1sRnJlZUVudGl0aWVzVGFibGUJKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpOwogI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkJeG1sRHVtcEVudGl0aWVzVGFibGUJKHhtbEJ1ZmZlclB0ciBidWYsCiAJCQkJCQkgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCQl4bWxEdW1wRW50aXR5RGVjbAkoeG1sQnVmZmVyUHRyIGJ1ZiwKIAkJCQkJCSB4bWxFbnRpdHlQdHIgZW50KTsKICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KICNpZmRlZiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXModm9pZCk7CiAjZW5kaWYgLyogTElCWE1MX0xFR0FDWV9FTkFCTEVEICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL2dsb2JhbHMuaCBiL2luY2x1ZGUvbGlieG1sL2dsb2JhbHMuaAppbmRleCAxMTczYThmLi41N2UyNWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC9nbG9iYWxzLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvZ2xvYmFscy5oCkBAIC0yOCw4ICsyOCwzMiBAQAogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTCB4bWxJbml0R2xvYmFscyh2b2lkKTsKIFhNTFBVQkZVTiB2b2lkIFhNTENBTEwgeG1sQ2xlYW51cEdsb2JhbHModm9pZCk7CiAKKy8qKgorICogeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmM6CisgKiBAVVJJOiB0aGUgVVJJIHRvIHJlYWQgZnJvbQorICogQGVuYzogdGhlIHJlcXVlc3RlZCBzb3VyY2UgZW5jb2RpbmcKKyAqCisgKiBTaWduYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiBkb2luZyB0aGUgbG9va3VwIGZvciBhIHN1aXRhYmxlIGlucHV0IG1ldGhvZAorICogY29ycmVzcG9uZGluZyB0byBhbiBVUkkuCisgKgorICogUmV0dXJucyB0aGUgbmV3IHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBOVUxMIGlmIG5vCisgKiAgICAgICAgIG1ldGhvZCB3YXMgZm91bmQuCisgKi8KIHR5cGVkZWYgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgKCp4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lRnVuYykgKGNvbnN0IGNoYXIgKlVSSSwgeG1sQ2hhckVuY29kaW5nIGVuYyk7CisKKy8qKgorICogeG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWVGdW5jOgorICogQFVSSTogdGhlIFVSSSB0byB3cml0ZSB0bworICogQGVuYzogdGhlIHJlcXVlc3RlZCB0YXJnZXQgZW5jb2RpbmcKKyAqCisgKiBTaWduYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiBkb2luZyB0aGUgbG9va3VwIGZvciBhIHN1aXRhYmxlIG91dHB1dCBtZXRob2QKKyAqIGNvcnJlc3BvbmRpbmcgdG8gYW4gVVJJLgorICoKKyAqIFJldHVybnMgdGhlIG5ldyB4bWxPdXRwdXRCdWZmZXJQdHIgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIE5VTEwgaWYgbm8KKyAqICAgICAgICAgbWV0aG9kIHdhcyBmb3VuZC4KKyAqLwogdHlwZWRlZiB4bWxPdXRwdXRCdWZmZXJQdHIgKCp4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMpIChjb25zdCBjaGFyICpVUkksIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlciwgaW50IGNvbXByZXNzaW9uKTsKKwogWE1MUFVCRlVOIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWVGdW5jCiBYTUxDQUxMIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWVEZWZhdWx0ICh4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lRnVuYyBmdW5jKTsKIFhNTFBVQkZVTiB4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMKQEAgLTczLDEyICs5NywyNCBAQAogI3VuZGVmICB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lVmFsdWUKICN1bmRlZiAgeG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWVWYWx1ZQogCisvKioKKyAqIHhtbFJlZ2lzdGVyTm9kZUZ1bmM6CisgKiBAbm9kZTogdGhlIGN1cnJlbnQgbm9kZQorICoKKyAqIFNpZ25hdHVyZSBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBjYWxsYmFjayBvZiBhIGNyZWF0ZWQgbm9kZQorICovCiB0eXBlZGVmIHZvaWQgKCp4bWxSZWdpc3Rlck5vZGVGdW5jKSAoeG1sTm9kZVB0ciBub2RlKTsKKy8qKgorICogeG1sRGVyZWdpc3Rlck5vZGVGdW5jOgorICogQG5vZGU6IHRoZSBjdXJyZW50IG5vZGUKKyAqCisgKiBTaWduYXR1cmUgZm9yIHRoZSBkZXJlZ2lzdHJhdGlvbiBjYWxsYmFjayBvZiBhIGRpc2NhcmRlZCBub2RlCisgKi8KIHR5cGVkZWYgdm9pZCAoKnhtbERlcmVnaXN0ZXJOb2RlRnVuYykgKHhtbE5vZGVQdHIgbm9kZSk7CiAKIHR5cGVkZWYgc3RydWN0IF94bWxHbG9iYWxTdGF0ZSB4bWxHbG9iYWxTdGF0ZTsKIHR5cGVkZWYgeG1sR2xvYmFsU3RhdGUgKnhtbEdsb2JhbFN0YXRlUHRyOwotc3RydWN0IF94bWxHbG9iYWxTdGF0ZSAKK3N0cnVjdCBfeG1sR2xvYmFsU3RhdGUKIHsKIAljb25zdCBjaGFyICp4bWxQYXJzZXJWZXJzaW9uOwogCkBAIC0xMTQsOCArMTUwLDggQEAKIAlpbnQgeG1sSW5kZW50VHJlZU91dHB1dDsKIAljb25zdCBjaGFyICp4bWxUcmVlSW5kZW50U3RyaW5nOwogCi0gIAl4bWxSZWdpc3Rlck5vZGVGdW5jIHhtbFJlZ2lzdGVyTm9kZURlZmF1bHRWYWx1ZTsKLSAgCXhtbERlcmVnaXN0ZXJOb2RlRnVuYyB4bWxEZXJlZ2lzdGVyTm9kZURlZmF1bHRWYWx1ZTsKKwl4bWxSZWdpc3Rlck5vZGVGdW5jIHhtbFJlZ2lzdGVyTm9kZURlZmF1bHRWYWx1ZTsKKwl4bWxEZXJlZ2lzdGVyTm9kZUZ1bmMgeG1sRGVyZWdpc3Rlck5vZGVEZWZhdWx0VmFsdWU7CiAKIAl4bWxNYWxsb2NGdW5jIHhtbE1hbGxvY0F0b21pYzsKIAl4bWxFcnJvciB4bWxMYXN0RXJyb3I7CkBAIC0xNDMsOSArMTc5LDkgQEAKIFhNTFBVQkZVTiB4bWxEZXJlZ2lzdGVyTm9kZUZ1bmMgWE1MQ0FMTCB4bWxEZXJlZ2lzdGVyTm9kZURlZmF1bHQoeG1sRGVyZWdpc3Rlck5vZGVGdW5jIGZ1bmMpOwogWE1MUFVCRlVOIHhtbERlcmVnaXN0ZXJOb2RlRnVuYyBYTUxDQUxMIHhtbFRockRlZkRlcmVnaXN0ZXJOb2RlRGVmYXVsdCh4bWxEZXJlZ2lzdGVyTm9kZUZ1bmMgZnVuYyk7CiAKLVhNTFBVQkZVTiB4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMgWE1MQ0FMTCAKK1hNTFBVQkZVTiB4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMgWE1MQ0FMTAogCXhtbFRockRlZk91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lRGVmYXVsdCh4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMgZnVuYyk7Ci1YTUxQVUJGVU4geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMgWE1MQ0FMTCAKK1hNTFBVQkZVTiB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lRnVuYyBYTUxDQUxMCiAJeG1sVGhyRGVmUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZURlZmF1bHQoeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZUZ1bmMgZnVuYyk7CiAKIC8qKiBET0NfRElTQUJMRSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwvcGFyc2VyLmggYi9pbmNsdWRlL2xpYnhtbC9wYXJzZXIuaAppbmRleCBmZTYzYmRhLi41NjdhZGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC9wYXJzZXIuaAorKysgYi9pbmNsdWRlL2xpYnhtbC9wYXJzZXIuaApAQCAtMjk3LDYgKzI5Nyw4IEBACiAgICAgICovCiAgICAgeG1sRXJyb3IgICAgICAgICAgbGFzdEVycm9yOwogICAgIHhtbFBhcnNlck1vZGUgICAgIHBhcnNlTW9kZTsgICAgLyogdGhlIHBhcnNlciBtb2RlICovCisgICAgdW5zaWduZWQgbG9uZyAgICBuYmVudGl0aWVzOyAgICAvKiBudW1iZXIgb2YgZW50aXRpZXMgcmVmZXJlbmNlcyAqLworICAgIHVuc2lnbmVkIGxvbmcgIHNpemVlbnRpdGllczsgICAgLyogc2l6ZSBvZiBwYXJzZWQgZW50aXRpZXMgKi8KIH07CiAKIC8qKgpAQCAtNTkyLDcgKzU5NCw3IEBACiAgKiBEaXNwbGF5IGFuZCBmb3JtYXQgYSB3YXJuaW5nIG1lc3NhZ2VzLCBjYWxsYmFjay4KICAqLwogdHlwZWRlZiB2b2lkIChYTUxDREVDTCAqd2FybmluZ1NBWEZ1bmMpICh2b2lkICpjdHgsCi0JCQkJY29uc3QgY2hhciAqbXNnLCAuLi4pOworCQkJCWNvbnN0IGNoYXIgKm1zZywgLi4uKSBBVFRSSUJVVEVfUFJJTlRGKDIsMyk7CiAvKioKICAqIGVycm9yU0FYRnVuYzoKICAqIEBjdHg6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKQEAgLTYwMiw3ICs2MDQsNyBAQAogICogRGlzcGxheSBhbmQgZm9ybWF0IGFuIGVycm9yIG1lc3NhZ2VzLCBjYWxsYmFjay4KICAqLwogdHlwZWRlZiB2b2lkIChYTUxDREVDTCAqZXJyb3JTQVhGdW5jKSAodm9pZCAqY3R4LAotCQkJCWNvbnN0IGNoYXIgKm1zZywgLi4uKTsKKwkJCQljb25zdCBjaGFyICptc2csIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOwogLyoqCiAgKiBmYXRhbEVycm9yU0FYRnVuYzoKICAqIEBjdHg6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKQEAgLTYxNCw3ICs2MTYsNyBAQAogICogICAgICAgZ2V0IGFsbCB0aGUgY2FsbGJhY2tzIGZvciBlcnJvcnMuCiAgKi8KIHR5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKmZhdGFsRXJyb3JTQVhGdW5jKSAodm9pZCAqY3R4LAotCQkJCWNvbnN0IGNoYXIgKm1zZywgLi4uKTsKKwkJCQljb25zdCBjaGFyICptc2csIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOwogLyoqCiAgKiBpc1N0YW5kYWxvbmVTQVhGdW5jOgogICogQGN0eDogIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkKQEAgLTEwODksOSArMTA5MSwxMyBAQAogICAgIFhNTF9QQVJTRV9OU0NMRUFOCT0gMTw8MTMsLyogcmVtb3ZlIHJlZHVuZGFudCBuYW1lc3BhY2VzIGRlY2xhcmF0aW9ucyAqLwogICAgIFhNTF9QQVJTRV9OT0NEQVRBCT0gMTw8MTQsLyogbWVyZ2UgQ0RBVEEgYXMgdGV4dCBub2RlcyAqLwogICAgIFhNTF9QQVJTRV9OT1hJTkNOT0RFPSAxPDwxNSwvKiBkbyBub3QgZ2VuZXJhdGUgWElOQ0xVREUgU1RBUlQvRU5EIG5vZGVzICovCi0gICAgWE1MX1BBUlNFX0NPTVBBQ1QgICA9IDE8PDE2IC8qIGNvbXBhY3Qgc21hbGwgdGV4dCBub2Rlczsgbm8gbW9kaWZpY2F0aW9uIG9mCisgICAgWE1MX1BBUlNFX0NPTVBBQ1QgICA9IDE8PDE2LC8qIGNvbXBhY3Qgc21hbGwgdGV4dCBub2Rlczsgbm8gbW9kaWZpY2F0aW9uIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmVlIGFsbG93ZWQgYWZ0ZXJ3YXJkcyAod2lsbCBwb3NzaWJseQogCQkJCSAgIGNyYXNoIGlmIHlvdSB0cnkgdG8gbW9kaWZ5IHRoZSB0cmVlKSAqLworICAgIFhNTF9QQVJTRV9PTEQxMAk9IDE8PDE3LC8qIHBhcnNlIHVzaW5nIFhNTC0xLjAgYmVmb3JlIHVwZGF0ZSA1ICovCisgICAgWE1MX1BBUlNFX05PQkFTRUZJWCA9IDE8PDE4LC8qIGRvIG5vdCBmaXh1cCBYSU5DTFVERSB4bWw6YmFzZSB1cmlzICovCisgICAgWE1MX1BBUlNFX0hVR0UgICAgICA9IDE8PDE5LCAvKiByZWxheCBhbnkgaGFyZGNvZGVkIGxpbWl0IGZyb20gdGhlIHBhcnNlciAqLworICAgIFhNTF9QQVJTRV9PTERTQVggICAgPSAxPDwyMCAvKiBwYXJzZSB1c2luZyBTQVgyIGludGVyZmFjZSBmcm9tIGJlZm9yZSAyLjcuMCAqLwogfSB4bWxQYXJzZXJPcHRpb247CiAKIFhNTFBVQkZVTiB2b2lkIFhNTENBTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3BhcnNlckludGVybmFscy5oIGIvaW5jbHVkZS9saWJ4bWwvcGFyc2VySW50ZXJuYWxzLmgKaW5kZXggN2FjMGNlNi4uYTVlNzViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwvcGFyc2VySW50ZXJuYWxzLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvcGFyc2VySW50ZXJuYWxzLmgKQEAgLTI0LDE4ICsyNCwyNyBAQAogLyoqCiAgKiB4bWxQYXJzZXJNYXhEZXB0aDoKICAqCi0gKiBhcmJpdHJhcnkgZGVwdGggbGltaXQgZm9yIHRoZSBYTUwgZG9jdW1lbnRzIHRoYXQgd2UgYWxsb3cgdG8gCi0gKiBwcm9jZXNzLiBUaGlzIGlzIG5vdCBhIGxpbWl0YXRpb24gb2YgdGhlIHBhcnNlciBidXQgYSBzYWZldHkgCi0gKiBib3VuZGFyeSBmZWF0dXJlLgorICogYXJiaXRyYXJ5IGRlcHRoIGxpbWl0IGZvciB0aGUgWE1MIGRvY3VtZW50cyB0aGF0IHdlIGFsbG93IHRvCisgKiBwcm9jZXNzLiBUaGlzIGlzIG5vdCBhIGxpbWl0YXRpb24gb2YgdGhlIHBhcnNlciBidXQgYSBzYWZldHkKKyAqIGJvdW5kYXJ5IGZlYXR1cmUsIHVzZSBYTUxfUEFSU0VfSFVHRSBvcHRpb24gdG8gb3ZlcnJpZGUgaXQuCiAgKi8KIFhNTFBVQlZBUiB1bnNpZ25lZCBpbnQgeG1sUGFyc2VyTWF4RGVwdGg7CiAKLSAvKioKLSAgKiBYTUxfTUFYX05BTUVMRU46Ci0gICoKLSAgKiBJZGVudGlmaWVycyBjYW4gYmUgbG9uZ2VyLCBidXQgdGhpcyB3aWxsIGJlIG1vcmUgY29zdGx5Ci0gICogYXQgcnVudGltZS4KLSAgKi8KKy8qKgorICogWE1MX01BWF9URVhUX0xFTkdUSDoKKyAqCisgKiBNYXhpbXVtIHNpemUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgdGV4dCBub2RlIHdoZW4gYnVpbGRpbmcgYSB0cmVlLgorICogVGhpcyBpcyBub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBwYXJzZXIgYnV0IGEgc2FmZXR5IGJvdW5kYXJ5IGZlYXR1cmUsCisgKiB1c2UgWE1MX1BBUlNFX0hVR0Ugb3B0aW9uIHRvIG92ZXJyaWRlIGl0LgorICovCisjZGVmaW5lIFhNTF9NQVhfVEVYVF9MRU5HVEggMTAwMDAwMDAKKworLyoqCisgKiBYTUxfTUFYX05BTUVMRU46CisgKgorICogSWRlbnRpZmllcnMgY2FuIGJlIGxvbmdlciwgYnV0IHRoaXMgd2lsbCBiZSBtb3JlIGNvc3RseQorICogYXQgcnVudGltZS4KKyAqLwogI2RlZmluZSBYTUxfTUFYX05BTUVMRU4gMTAwCiAKIC8qKgpAQCAtMzIxLDcgKzMzMCw3IEBACiBYTUxQVUJGVU4geG1sUGFyc2VySW5wdXRQdHIgWE1MQ0FMTAkKIAkJCXhtbE5ld0VudGl0eUlucHV0U3RyZWFtCSh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsCiAJCQkJCQkgeG1sRW50aXR5UHRyIGVudGl0eSk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwJCQkKIAkJCXhtbFB1c2hJbnB1dAkJKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwKIAkJCQkJCSB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dCk7CiBYTUxQVUJGVU4geG1sQ2hhciBYTUxDQUxMCQkJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnhtbC9yZWxheG5nLmggYi9pbmNsdWRlL2xpYnhtbC9yZWxheG5nLmgKaW5kZXggNmFjZDQ2Ny4uZDNlMzllMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwvcmVsYXhuZy5oCisrKyBiL2luY2x1ZGUvbGlieG1sL3JlbGF4bmcuaApAQCAtMjUsMTEgKzI1LDI4IEBACiAKIAogLyoqCisgKiB4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmM6CisgKiBAY3R4OiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAbXNnOiB0aGUgbWVzc2FnZQorICogQC4uLjogZXh0cmEgYXJndW1lbnRzCisgKgorICogU2lnbmF0dXJlIG9mIGFuIGVycm9yIGNhbGxiYWNrIGZyb20gYSBSZWxheC1ORyB2YWxpZGF0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKnhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYykgKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbXNnLCAuLi4pIEFUVFJJQlVURV9QUklOVEYoMiwzKTsKKworLyoqCisgKiB4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYzoKKyAqIEBjdHg6IHRoZSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBtc2c6IHRoZSBtZXNzYWdlCisgKiBALi4uOiBleHRyYSBhcmd1bWVudHMKKyAqCisgKiBTaWduYXR1cmUgb2YgYSB3YXJuaW5nIGNhbGxiYWNrIGZyb20gYSBSZWxheC1ORyB2YWxpZGF0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKnhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jKSAodm9pZCAqY3R4LCBjb25zdCBjaGFyICptc2csIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOworCisvKioKICAqIEEgc2NoZW1hcyB2YWxpZGF0aW9uIGNvbnRleHQKICAqLwotdHlwZWRlZiB2b2lkIChYTUxDREVDTCAqeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jKSAodm9pZCAqY3R4LCBjb25zdCBjaGFyICptc2csIC4uLik7Ci10eXBlZGVmIHZvaWQgKFhNTENERUNMICp4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYykgKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbXNnLCAuLi4pOwotCiB0eXBlZGVmIHN0cnVjdCBfeG1sUmVsYXhOR1BhcnNlckN0eHQgeG1sUmVsYXhOR1BhcnNlckN0eHQ7CiB0eXBlZGVmIHhtbFJlbGF4TkdQYXJzZXJDdHh0ICp4bWxSZWxheE5HUGFyc2VyQ3R4dFB0cjsKIApAQCAtOTcsMjcgKzExNCwyNyBAQAogCiBYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlbGF4TkdJbml0VHlwZXMJCSh2b2lkKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJICAgIHhtbFJlbGF4TkdDbGVhbnVwVHlwZXMJKHZvaWQpOwogCiAvKgogICogSW50ZXJmYWNlcyBmb3IgcGFyc2luZy4KICAqLwotWE1MUFVCRlVOIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIFhNTENBTEwgCitYTUxQVUJGVU4geG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR05ld1BhcnNlckN0eHQJKGNvbnN0IGNoYXIgKlVSTCk7Ci1YTUxQVUJGVU4geG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgWE1MQ0FMTCAKK1hNTFBVQkZVTiB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBYTUxDQUxMCiAJCSAgICB4bWxSZWxheE5HTmV3TWVtUGFyc2VyQ3R4dAkoY29uc3QgY2hhciAqYnVmZmVyLAogCQkJCQkJIGludCBzaXplKTsKLVhNTFBVQkZVTiB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBYTUxDQUxMICAgCitYTUxQVUJGVU4geG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR05ld0RvY1BhcnNlckN0eHQJKHhtbERvY1B0ciBkb2MpOwogCiBYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlbGF4UGFyc2VyU2V0RmxhZwkoeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgY3R4dCwKLQkJICAgIAkJCQkgaW50IGZsYWcpOworCQkJCQkJIGludCBmbGFnKTsKIAotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCSAgICB4bWxSZWxheE5HRnJlZVBhcnNlckN0eHQJKHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIGN0eHQpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR1NldFBhcnNlckVycm9ycyh4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBjdHh0LAogCQkJCQkgeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jIGVyciwKIAkJCQkJIHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jIHdhcm4sCkBAIC0xMzIsMTIgKzE0OSwxMiBAQAogCQkJCQkgeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgY3R4dCwKIAkJCQkJIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmMgc2Vycm9yLAogCQkJCQkgdm9pZCAqY3R4KTsKLVhNTFBVQkZVTiB4bWxSZWxheE5HUHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sUmVsYXhOR1B0ciBYTUxDQUxMCiAJCSAgICB4bWxSZWxheE5HUGFyc2UJCSh4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBjdHh0KTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR0ZyZWUJCSh4bWxSZWxheE5HUHRyIHNjaGVtYSk7CiAjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECi1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJICAgIHhtbFJlbGF4TkdEdW1wCQkoRklMRSAqb3V0cHV0LAogCQkJCQkgeG1sUmVsYXhOR1B0ciBzY2hlbWEpOwogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTApAQCAtMTQ3LDEyICsxNjQsMTIgQEAKIC8qCiAgKiBJbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nCiAgKi8KLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR1NldFZhbGlkRXJyb3JzKHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dCwKIAkJCQkJIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyBlcnIsCiAJCQkJCSB4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYyB3YXJuLAogCQkJCQkgdm9pZCAqY3R4KTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR0dldFZhbGlkRXJyb3JzKHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dCwKIAkJCQkJIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyAqZXJyLAogCQkJCQkgeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMgKndhcm4sCkBAIC0xNjAsMjkgKzE3NywyOSBAQAogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkJeG1sUmVsYXhOR1NldFZhbGlkU3RydWN0dXJlZEVycm9ycyh4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQsCiAJCQkJCSAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzZXJyb3IsIHZvaWQgKmN0eCk7Ci1YTUxQVUJGVU4geG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR05ld1ZhbGlkQ3R4dAkoeG1sUmVsYXhOR1B0ciBzY2hlbWEpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR0ZyZWVWYWxpZEN0eHQJKHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dCk7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR1ZhbGlkYXRlRG9jCSh4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQsCi0JCQkJCSAJIHhtbERvY1B0ciBkb2MpOworCQkJCQkJIHhtbERvY1B0ciBkb2MpOwogLyoKICAqIEludGVyZmFjZXMgZm9yIHByb2dyZXNzaXZlIHZhbGlkYXRpb24gd2hlbiBwb3NzaWJsZQogICovCi1YTUxQVUJGVU4gaW50IFhNTENBTEwJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlbGF4TkdWYWxpZGF0ZVB1c2hFbGVtZW50CSh4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQsCiAJCQkJCSB4bWxEb2NQdHIgZG9jLAogCQkJCQkgeG1sTm9kZVB0ciBlbGVtKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhCSh4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQsCiAJCQkJCSBjb25zdCB4bWxDaGFyICpkYXRhLAogCQkJCQkgaW50IGxlbik7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlbGF4TkdWYWxpZGF0ZVBvcEVsZW1lbnQJKHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dCwKIAkJCQkJIHhtbERvY1B0ciBkb2MsCiAJCQkJCSB4bWxOb2RlUHRyIGVsZW0pOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxSZWxheE5HVmFsaWRhdGVGdWxsRWxlbWVudAkoeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0LAogCQkJCQkgeG1sRG9jUHRyIGRvYywKIAkJCQkJIHhtbE5vZGVQdHIgZWxlbSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnhtbC9zY2hlbWF0cm9uLmggYi9pbmNsdWRlL2xpYnhtbC9zY2hlbWF0cm9uLmgKaW5kZXggNmVhYTY5OS4uZjQ0MjgyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwvc2NoZW1hdHJvbi5oCisrKyBiL2luY2x1ZGUvbGlieG1sL3NjaGVtYXRyb24uaApAQCAtMjUsNiArMjUsNyBAQAogICAgIFhNTF9TQ0hFTUFUUk9OX09VVF9RVUlFVCA9IDEgPDwgMCwJLyogcXVpZXQgbm8gcmVwb3J0ICovCiAgICAgWE1MX1NDSEVNQVRST05fT1VUX1RFWFQgPSAxIDw8IDEsCS8qIGJ1aWxkIGEgdGV4dHVhbCByZXBvcnQgKi8KICAgICBYTUxfU0NIRU1BVFJPTl9PVVRfWE1MID0gMSA8PCAyLAkvKiBvdXRwdXQgU1ZSTCAqLworICAgIFhNTF9TQ0hFTUFUUk9OX09VVF9FUlJPUiA9IDEgPDwgMywgIC8qIG91dHB1dCB2aWEgeG1sU3RydWN0dXJlZEVycm9yRnVuYyAqLwogICAgIFhNTF9TQ0hFTUFUUk9OX09VVF9GSUxFID0gMSA8PCA4LAkvKiBvdXRwdXQgdG8gYSBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICBYTUxfU0NIRU1BVFJPTl9PVVRfQlVGRkVSID0gMSA8PCA5LAkvKiBvdXRwdXQgdG8gYSBidWZmZXIgKi8KICAgICBYTUxfU0NIRU1BVFJPTl9PVVRfSU8gPSAxIDw8IDEwCS8qIG91dHB1dCB0byBJL08gbWVjaGFuaXNtICovCkBAIC0zNywxMSArMzgsMjggQEAKIHR5cGVkZWYgeG1sU2NoZW1hdHJvbiAqeG1sU2NoZW1hdHJvblB0cjsKIAogLyoqCi0gKiBBIHNjaGVtYXMgdmFsaWRhdGlvbiBjb250ZXh0CisgKiB4bWxTY2hlbWF0cm9uVmFsaWRpdHlFcnJvckZ1bmM6CisgKiBAY3R4OiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAbXNnOiB0aGUgbWVzc2FnZQorICogQC4uLjogZXh0cmEgYXJndW1lbnRzCisgKgorICogU2lnbmF0dXJlIG9mIGFuIGVycm9yIGNhbGxiYWNrIGZyb20gYSBTY2hlbWF0cm9uIHZhbGlkYXRpb24KICAqLwogdHlwZWRlZiB2b2lkICgqeG1sU2NoZW1hdHJvblZhbGlkaXR5RXJyb3JGdW5jKSAodm9pZCAqY3R4LCBjb25zdCBjaGFyICptc2csIC4uLik7CisKKy8qKgorICogeG1sU2NoZW1hdHJvblZhbGlkaXR5V2FybmluZ0Z1bmM6CisgKiBAY3R4OiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAbXNnOiB0aGUgbWVzc2FnZQorICogQC4uLjogZXh0cmEgYXJndW1lbnRzCisgKgorICogU2lnbmF0dXJlIG9mIGEgd2FybmluZyBjYWxsYmFjayBmcm9tIGEgU2NoZW1hdHJvbiB2YWxpZGF0aW9uCisgKi8KIHR5cGVkZWYgdm9pZCAoKnhtbFNjaGVtYXRyb25WYWxpZGl0eVdhcm5pbmdGdW5jKSAodm9pZCAqY3R4LCBjb25zdCBjaGFyICptc2csIC4uLik7CiAKKy8qKgorICogQSBzY2hlbWFzIHZhbGlkYXRpb24gY29udGV4dAorICovCiB0eXBlZGVmIHN0cnVjdCBfeG1sU2NoZW1hdHJvblBhcnNlckN0eHQgeG1sU2NoZW1hdHJvblBhcnNlckN0eHQ7CiB0eXBlZGVmIHhtbFNjaGVtYXRyb25QYXJzZXJDdHh0ICp4bWxTY2hlbWF0cm9uUGFyc2VyQ3R4dFB0cjsKIApAQCAtODEsMTIgKzk5LDEyIEBACiAvKgogICogSW50ZXJmYWNlcyBmb3IgdmFsaWRhdGluZwogICovCi0vKioqKioqCiBYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnMoCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIgY3R4dCwKIAkJCQkJICB4bWxTdHJ1Y3R1cmVkRXJyb3JGdW5jIHNlcnJvciwKIAkJCQkJICB2b2lkICpjdHgpOworLyoqKioqKgogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCiAJICAgIHhtbFNjaGVtYXRyb25TZXRWYWxpZEVycm9ycwkoeG1sU2NoZW1hdHJvblZhbGlkQ3R4dFB0ciBjdHh0LAogCQkJCQkgeG1sU2NoZW1hdHJvblZhbGlkaXR5RXJyb3JGdW5jIGVyciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3RocmVhZHMuaCBiL2luY2x1ZGUvbGlieG1sL3RocmVhZHMuaAppbmRleCBmODFmOTgyLi5kMzFmMTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC90aHJlYWRzLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvdGhyZWFkcy5oCkBAIC0zNiw0MCArMzYsNDAgQEAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLVhNTFBVQkZVTiB4bWxNdXRleFB0ciBYTUxDQUxMCQkKK1hNTFBVQkZVTiB4bWxNdXRleFB0ciBYTUxDQUxMCiAJCQl4bWxOZXdNdXRleAkodm9pZCk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCQl4bWxNdXRleExvY2sJKHhtbE11dGV4UHRyIHRvayk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCQl4bWxNdXRleFVubG9jawkoeG1sTXV0ZXhQdHIgdG9rKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbEZyZWVNdXRleAkoeG1sTXV0ZXhQdHIgdG9rKTsKIAotWE1MUFVCRlVOIHhtbFJNdXRleFB0ciBYTUxDQUxMCQkKK1hNTFBVQkZVTiB4bWxSTXV0ZXhQdHIgWE1MQ0FMTAogCQkJeG1sTmV3Uk11dGV4CSh2b2lkKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbFJNdXRleExvY2sJKHhtbFJNdXRleFB0ciB0b2spOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkJeG1sUk11dGV4VW5sb2NrCSh4bWxSTXV0ZXhQdHIgdG9rKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbEZyZWVSTXV0ZXgJKHhtbFJNdXRleFB0ciB0b2spOwogCiAvKgogICogTGlicmFyeSB3aWRlIEFQSXMuCiAgKi8KLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbEluaXRUaHJlYWRzCSh2b2lkKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbExvY2tMaWJyYXJ5CSh2b2lkKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkJCXhtbFVubG9ja0xpYnJhcnkodm9pZCk7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkJeG1sR2V0VGhyZWFkSWQJKHZvaWQpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbElzTWFpblRocmVhZAkodm9pZCk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCQl4bWxDbGVhbnVwVGhyZWFkcyh2b2lkKTsKLVhNTFBVQkZVTiB4bWxHbG9iYWxTdGF0ZVB0ciBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbEdsb2JhbFN0YXRlUHRyIFhNTENBTEwKIAkJCXhtbEdldEdsb2JhbFN0YXRlKHZvaWQpOwogCiAjaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpICYmICFkZWZpbmVkKEhBVkVfQ09NUElMRVJfVExTKSAmJiBkZWZpbmVkKExJQlhNTF9TVEFUSUNfRk9SX0RMTCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3RyZWUuaCBiL2luY2x1ZGUvbGlieG1sL3RyZWUuaAppbmRleCAwZTFkNDdjLi5iNzMzNTg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC90cmVlLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvdHJlZS5oCkBAIC03MSw5ICs3MSwxMCBAQAogICovCiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCwKLSAgICBYTUxfQlVGRkVSX0FMTE9DX0VYQUNULAotICAgIFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFCisgICAgWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCwJLyogZG91YmxlIGVhY2ggdGltZSBvbmUgbmVlZCB0byBncm93ICovCisgICAgWE1MX0JVRkZFUl9BTExPQ19FWEFDVCwJLyogZ3JvdyBvbmx5IHRvIHRoZSBtaW5pbWFsIHNpemUgKi8KKyAgICBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSwgLyogaW1tdXRhYmxlIGJ1ZmZlciAqLworICAgIFhNTF9CVUZGRVJfQUxMT0NfSU8JCS8qIHNwZWNpYWwgYWxsb2NhdGlvbiBzY2hlbWUgdXNlZCBmb3IgSS9PICovCiB9IHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWU7CiAKIC8qKgpAQCAtODgsNiArODksNyBAQAogICAgIHVuc2lnbmVkIGludCB1c2U7CQkvKiBUaGUgYnVmZmVyIHNpemUgdXNlZCAqLwogICAgIHVuc2lnbmVkIGludCBzaXplOwkJLyogVGhlIGJ1ZmZlciBzaXplICovCiAgICAgeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZSBhbGxvYzsgLyogVGhlIHJlYWxsb2MgbWV0aG9kICovCisgICAgeG1sQ2hhciAqY29udGVudElPOwkJLyogaW4gSU8gbW9kZSB3ZSBtYXkgaGF2ZSBhIGRpZmZlcmVudCBiYXNlICovCiB9OwogCiAvKioKQEAgLTQ4Miw2ICs0ODQsMjMgQEAKICNkZWZpbmUgWE1MX0dFVF9MSU5FKG4pCQkJCQkJXAogICAgICh4bWxHZXRMaW5lTm8obikpCiAKKy8qKgorICogeG1sRG9jUHJvcGVydHkKKyAqCisgKiBTZXQgb2YgcHJvcGVydGllcyBvZiB0aGUgZG9jdW1lbnQgYXMgZm91bmQgYnkgdGhlIHBhcnNlcgorICogU29tZSBvZiB0aGVtIGFyZSBsaW5rZWQgdG8gc2ltaWxhcnkgbmFtZWQgeG1sUGFyc2VyT3B0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgWE1MX0RPQ19XRUxMRk9STUVECQk9IDE8PDAsIC8qIGRvY3VtZW50IGlzIFhNTCB3ZWxsIGZvcm1lZCAqLworICAgIFhNTF9ET0NfTlNWQUxJRAkJPSAxPDwxLCAvKiBkb2N1bWVudCBpcyBOYW1lc3BhY2UgdmFsaWQgKi8KKyAgICBYTUxfRE9DX09MRDEwCQk9IDE8PDIsIC8qIHBhcnNlZCB3aXRoIG9sZCBYTUwtMS4wIHBhcnNlciAqLworICAgIFhNTF9ET0NfRFREVkFMSUQJCT0gMTw8MywgLyogRFREIHZhbGlkYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKyAgICBYTUxfRE9DX1hJTkNMVURFCQk9IDE8PDQsIC8qIFhJbmNsdWRlIHN1YnN0aXR1dGlvbiB3YXMgZG9uZSAqLworICAgIFhNTF9ET0NfVVNFUkJVSUxUCQk9IDE8PDUsIC8qIERvY3VtZW50IHdhcyBidWlsdCB1c2luZyB0aGUgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBieSBwYXJzaW5nIGFuIGluc3RhbmNlICovCisgICAgWE1MX0RPQ19JTlRFUk5BTAkJPSAxPDw2LCAvKiBidWlsdCBmb3IgaW50ZXJuYWwgcHJvY2Vzc2luZyAqLworICAgIFhNTF9ET0NfSFRNTAkJPSAxPDw3ICAvKiBwYXJzZWQgb3IgYnVpbHQgSFRNTCBkb2N1bWVudCAqLworfSB4bWxEb2NQcm9wZXJ0aWVzOwogCiAvKioKICAqIHhtbERvYzoKQEAgLTUyMSw2ICs1NDAsMTAgQEAKIAkJCQkgICBhY3R1YWxseSBhbiB4bWxDaGFyRW5jb2RpbmcgKi8KICAgICBzdHJ1Y3QgX3htbERpY3QgKmRpY3Q7ICAgICAgLyogZGljdCB1c2VkIHRvIGFsbG9jYXRlIG5hbWVzIG9yIE5VTEwgKi8KICAgICB2b2lkICAgICAgICAgICAqcHN2aTsJLyogZm9yIHR5cGUvUFNWSSBpbmZvcm1hdGlvbnMgKi8KKyAgICBpbnQgICAgICAgICAgICAgcGFyc2VGbGFnczsJLyogc2V0IG9mIHhtbFBhcnNlck9wdGlvbiB1c2VkIHRvIHBhcnNlIHRoZQorCQkJCSAgIGRvY3VtZW50ICovCisgICAgaW50ICAgICAgICAgICAgIHByb3BlcnRpZXM7CS8qIHNldCBvZiB4bWxEb2NQcm9wZXJ0aWVzIGZvciB0aGlzIGRvY3VtZW50CisJCQkJICAgc2V0IGF0IHRoZSBlbmQgb2YgcGFyc2luZyAqLwogfTsKIAogCkBAIC0xMjAyLDYgKzEyMjUsMjIgQEAKIAkJCQkJIGludCBkZWVwLAogCQkJCQkgaW50IG9wdGlvbnMpOwogCisjaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAorLyoKKyAqIDUgaW50ZXJmYWNlcyBmcm9tIERPTSBFbGVtZW50VHJhdmVyc2FsLCBidXQgZGlmZmVyZW50IGluIGVudGl0aWVzCisgKiB0cmF2ZXJzYWwuCisgKi8KK1hNTFBVQkZVTiB1bnNpZ25lZCBsb25nIFhNTENBTEwKKyAgICAgICAgICAgIHhtbENoaWxkRWxlbWVudENvdW50ICAgICAgICAoeG1sTm9kZVB0ciBwYXJlbnQpOworWE1MUFVCRlVOIHhtbE5vZGVQdHIgWE1MQ0FMTAorICAgICAgICAgICAgeG1sTmV4dEVsZW1lbnRTaWJsaW5nICAgICAgICh4bWxOb2RlUHRyIG5vZGUpOworWE1MUFVCRlVOIHhtbE5vZGVQdHIgWE1MQ0FMTAorICAgICAgICAgICAgeG1sRmlyc3RFbGVtZW50Q2hpbGQgICAgICAgICh4bWxOb2RlUHRyIHBhcmVudCk7CitYTUxQVUJGVU4geG1sTm9kZVB0ciBYTUxDQUxMCisgICAgICAgICAgICB4bWxMYXN0RWxlbWVudENoaWxkICAgICAgICAgKHhtbE5vZGVQdHIgcGFyZW50KTsKK1hNTFBVQkZVTiB4bWxOb2RlUHRyIFhNTENBTEwKKyAgICAgICAgICAgIHhtbFByZXZpb3VzRWxlbWVudFNpYmxpbmcgICAoeG1sTm9kZVB0ciBub2RlKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3VyaS5oIGIvaW5jbHVkZS9saWJ4bWwvdXJpLmgKaW5kZXggNDllZDEwNS4uZGI0ODI2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwvdXJpLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvdXJpLmgKQEAgLTQ5LDQzICs0OSw0MyBAQAogICogeG1sQ2hhciAqCXhtbE5vZGVHZXRCYXNlCSh4bWxEb2NQdHIgZG9jLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBjdXIpOwogICovCi1YTUxQVUJGVU4geG1sVVJJUHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sVVJJUHRyIFhNTENBTEwKIAkJeG1sQ3JlYXRlVVJJCQkodm9pZCk7Ci1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwKIAkJeG1sQnVpbGRVUkkJCShjb25zdCB4bWxDaGFyICpVUkksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIAkgY29uc3QgeG1sQ2hhciAqYmFzZSk7Ci1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCisJCQkJCSBjb25zdCB4bWxDaGFyICpiYXNlKTsKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQl4bWxCdWlsZFJlbGF0aXZlVVJJCShjb25zdCB4bWxDaGFyICpVUkksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIAkgY29uc3QgeG1sQ2hhciAqYmFzZSk7Ci1YTUxQVUJGVU4geG1sVVJJUHRyIFhNTENBTEwJCisJCQkJCSBjb25zdCB4bWxDaGFyICpiYXNlKTsKK1hNTFBVQkZVTiB4bWxVUklQdHIgWE1MQ0FMTAogCQl4bWxQYXJzZVVSSQkJKGNvbnN0IGNoYXIgKnN0cik7Ci1YTUxQVUJGVU4geG1sVVJJUHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sVVJJUHRyIFhNTENBTEwKIAkJeG1sUGFyc2VVUklSYXcJCShjb25zdCBjaGFyICpzdHIsCiAJCQkJCSBpbnQgcmF3KTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJeG1sUGFyc2VVUklSZWZlcmVuY2UJKHhtbFVSSVB0ciB1cmksCiAJCQkJCSBjb25zdCBjaGFyICpzdHIpOwotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCXhtbFNhdmVVcmkJCSh4bWxVUklQdHIgdXJpKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQl4bWxQcmludFVSSQkJKEZJTEUgKnN0cmVhbSwKIAkJCQkJIHhtbFVSSVB0ciB1cmkpOwotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMICAgICAgIAorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCXhtbFVSSUVzY2FwZVN0ciAgICAgICAgIChjb25zdCB4bWxDaGFyICpzdHIsCi0gCQkJCQkgY29uc3QgeG1sQ2hhciAqbGlzdCk7Ci1YTUxQVUJGVU4gY2hhciAqIFhNTENBTEwJCQorCQkJCQkgY29uc3QgeG1sQ2hhciAqbGlzdCk7CitYTUxQVUJGVU4gY2hhciAqIFhNTENBTEwKIAkJeG1sVVJJVW5lc2NhcGVTdHJpbmcJKGNvbnN0IGNoYXIgKnN0ciwKIAkJCQkJIGludCBsZW4sCiAJCQkJCSBjaGFyICp0YXJnZXQpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQl4bWxOb3JtYWxpemVVUklQYXRoCShjaGFyICpwYXRoKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQl4bWxVUklFc2NhcGUJCShjb25zdCB4bWxDaGFyICpzdHIpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCXhtbEZyZWVVUkkJCSh4bWxVUklQdHIgdXJpKTsKLVhNTFBVQkZVTiB4bWxDaGFyKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIqIFhNTENBTEwKIAkJeG1sQ2Fub25pY1BhdGgJCShjb25zdCB4bWxDaGFyICpwYXRoKTsKLVhNTFBVQkZVTiB4bWxDaGFyKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIqIFhNTENBTEwKIAkJeG1sUGF0aFRvVVJJCQkoY29uc3QgeG1sQ2hhciAqcGF0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwvdmFsaWQuaCBiL2luY2x1ZGUvbGlieG1sL3ZhbGlkLmgKaW5kZXggNzQ5MmQyOC4uZjE4OTJiMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwvdmFsaWQuaAorKysgYi9pbmNsdWRlL2xpYnhtbC92YWxpZC5oCkBAIC00MSw3ICs0MSw3IEBACiAgKi8KIHR5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKnhtbFZhbGlkaXR5RXJyb3JGdW5jKSAodm9pZCAqY3R4LAogCQkJICAgICBjb25zdCBjaGFyICptc2csCi0JCQkgICAgIC4uLik7CisJCQkgICAgIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOwogCiAvKioKICAqIHhtbFZhbGlkaXR5V2FybmluZ0Z1bmM6CkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIHR5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKnhtbFZhbGlkaXR5V2FybmluZ0Z1bmMpICh2b2lkICpjdHgsCiAJCQkgICAgICAgY29uc3QgY2hhciAqbXNnLAotCQkJICAgICAgIC4uLik7CisJCQkgICAgICAgLi4uKSBBVFRSSUJVVEVfUFJJTlRGKDIsMyk7CiAKICNpZmRlZiBJTl9MSUJYTUwKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaCBiL2luY2x1ZGUvbGlieG1sL3htbGVycm9yLmgKaW5kZXggYzVmMjE2NC4uN2NjZTljMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaAorKysgYi9pbmNsdWRlL2xpYnhtbC94bWxlcnJvci5oCkBAIC02MSw3ICs2MSw4IEBACiAgICAgWE1MX0ZST01fQ0hFQ0ssCS8qIFRoZSBlcnJvciBjaGVja2luZyBtb2R1bGUgKi8KICAgICBYTUxfRlJPTV9XUklURVIsCS8qIFRoZSB4bWx3cml0ZXIgbW9kdWxlICovCiAgICAgWE1MX0ZST01fTU9EVUxFLAkvKiBUaGUgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZSBtb2R1bGUqLwotICAgIFhNTF9GUk9NX0kxOE4gCS8qIFRoZSBtb2R1bGUgaGFuZGxpbmcgY2hhcmFjdGVyIGNvbnZlcnNpb24gKi8KKyAgICBYTUxfRlJPTV9JMThOLAkvKiBUaGUgbW9kdWxlIGhhbmRsaW5nIGNoYXJhY3RlciBjb252ZXJzaW9uICovCisgICAgWE1MX0ZST01fU0NIRU1BVFJPTlYJLyogVGhlIFNjaGVtYXRyb24gdmFsaWRhdG9yIG1vZHVsZSAqLwogfSB4bWxFcnJvckRvbWFpbjsKIAogLyoqCkBAIC0yMDIsMTEgKzIwMywxNCBAQAogICAgIFhNTF9FUlJfTk9UQVRJT05fUFJPQ0VTU0lORywgLyogMTA1ICovCiAgICAgWE1MX1dBUl9OU19DT0xVTU4sIC8qIDEwNiAqLwogICAgIFhNTF9XQVJfRU5USVRZX1JFREVGSU5FRCwgLyogMTA3ICovCisgICAgWE1MX0VSUl9VTktOT1dOX1ZFUlNJT04sIC8qIDEwOCAqLworICAgIFhNTF9FUlJfVkVSU0lPTl9NSVNNQVRDSCwgLyogMTA5ICovCiAgICAgWE1MX05TX0VSUl9YTUxfTkFNRVNQQUNFID0gMjAwLAogICAgIFhNTF9OU19FUlJfVU5ERUZJTkVEX05BTUVTUEFDRSwgLyogMjAxICovCiAgICAgWE1MX05TX0VSUl9RTkFNRSwgLyogMjAyICovCiAgICAgWE1MX05TX0VSUl9BVFRSSUJVVEVfUkVERUZJTkVELCAvKiAyMDMgKi8KICAgICBYTUxfTlNfRVJSX0VNUFRZLCAvKiAyMDQgKi8KKyAgICBYTUxfTlNfRVJSX0NPTE9OLCAvKiAyMDUgKi8KICAgICBYTUxfRFREX0FUVFJJQlVURV9ERUZBVUxUID0gNTAwLAogICAgIFhNTF9EVERfQVRUUklCVVRFX1JFREVGSU5FRCwgLyogNTAxICovCiAgICAgWE1MX0RURF9BVFRSSUJVVEVfVkFMVUUsIC8qIDUwMiAqLwpAQCAtMjQ4LDYgKzI1Miw3IEBACiAgICAgWE1MX0RURF9TVEFOREFMT05FX0RFRkFVTFRFRCwgLyogNTM4ICovCiAgICAgWE1MX0RURF9YTUxJRF9WQUxVRSwgLyogNTM5ICovCiAgICAgWE1MX0RURF9YTUxJRF9UWVBFLCAvKiA1NDAgKi8KKyAgICBYTUxfRFREX0RVUF9UT0tFTiwgLyogNTQxICovCiAgICAgWE1MX0hUTUxfU1RSVUNVUkVfRVJST1IgPSA4MDAsCiAgICAgWE1MX0hUTUxfVU5LTk9XTl9UQUcsIC8qIDgwMSAqLwogICAgIFhNTF9STkdQX0FOWU5BTUVfQVRUUl9BTkNFU1RPUiA9IDEwMDAsCkBAIC0zOTgsNiArNDAzLDcgQEAKICAgICBYTUxfVFJFRV9JTlZBTElEX0hFWCA9IDEzMDAsCiAgICAgWE1MX1RSRUVfSU5WQUxJRF9ERUMsIC8qIDEzMDEgKi8KICAgICBYTUxfVFJFRV9VTlRFUk1JTkFURURfRU5USVRZLCAvKiAxMzAyICovCisgICAgWE1MX1RSRUVfTk9UX1VURjgsIC8qIDEzMDMgKi8KICAgICBYTUxfU0FWRV9OT1RfVVRGOCA9IDE0MDAsCiAgICAgWE1MX1NBVkVfQ0hBUl9JTlZBTElELCAvKiAxNDAxICovCiAgICAgWE1MX1NBVkVfTk9fRE9DVFlQRSwgLyogMTQwMiAqLwpAQCAtNjM5LDcgKzY0NSw3IEBACiAgICAgWE1MX1NDSEVNQVZfQ1ZDX0VMVF80XzMsIC8qIDE4NTIgKi8KICAgICBYTUxfU0NIRU1BVl9DVkNfRUxUXzVfMV8xLCAvKiAxODUzICovCiAgICAgWE1MX1NDSEVNQVZfQ1ZDX0VMVF81XzFfMiwgLyogMTg1NCAqLwotICAgIFhNTF9TQ0hFTUFWX0NWQ19FTFRfNV8yXzEsIC8qIDE4NTUgKi8gIAorICAgIFhNTF9TQ0hFTUFWX0NWQ19FTFRfNV8yXzEsIC8qIDE4NTUgKi8KICAgICBYTUxfU0NIRU1BVl9DVkNfRUxUXzVfMl8yXzEsIC8qIDE4NTYgKi8KICAgICBYTUxfU0NIRU1BVl9DVkNfRUxUXzVfMl8yXzJfMSwgLyogMTg1NyAqLwogICAgIFhNTF9TQ0hFTUFWX0NWQ19FTFRfNV8yXzJfMl8yLCAvKiAxODU4ICovCkBAIC02NjQsNyArNjcwLDcgQEAKICAgICBYTUxfU0NIRU1BVl9DVkNfSURDLCAvKiAxODc3ICovCiAgICAgWE1MX1NDSEVNQVZfQ1ZDX1dJTERDQVJELCAvKiAxODc4ICovCiAgICAgWE1MX1NDSEVNQVZfTUlTQywgLyogMTg3OSAqLwotICAgIFhNTF9YUFRSX1VOS05PV05fU0NIRU1FID0gMTkwMCwgCisgICAgWE1MX1hQVFJfVU5LTk9XTl9TQ0hFTUUgPSAxOTAwLAogICAgIFhNTF9YUFRSX0NISUxEU0VRX1NUQVJULCAvKiAxOTAxICovCiAgICAgWE1MX1hQVFJfRVZBTF9GQUlMRUQsIC8qIDE5MDIgKi8KICAgICBYTUxfWFBUUl9FWFRSQV9PQkpFQ1RTLCAvKiAxOTAzICovCkBAIC02ODUsMTUgKzY5MSwxNSBAQAogICAgIFhNTF9TQ0hFTUFQX1NSQ19TSU1QTEVfVFlQRV8yLCAvKiAzMDAxICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX1NJTVBMRV9UWVBFXzMsIC8qIDMwMDIgKi8KICAgICBYTUxfU0NIRU1BUF9TUkNfU0lNUExFX1RZUEVfNCwgLyogMzAwMyAqLwotICAgIFhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLCAvKiAzMDA0ICovIAorICAgIFhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLCAvKiAzMDA0ICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX1JFU1RSSUNUSU9OX0JBU0VfT1JfU0lNUExFVFlQRSwgLyogMzAwNSAqLwogICAgIFhNTF9TQ0hFTUFQX1NSQ19MSVNUX0lURU1UWVBFX09SX1NJTVBMRVRZUEUsIC8qIDMwMDYgKi8KICAgICBYTUxfU0NIRU1BUF9TUkNfVU5JT05fTUVNQkVSVFlQRVNfT1JfU0lNUExFVFlQRVMsIC8qIDMwMDcgKi8KICAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEsIC8qIDMwMDggKi8KICAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzIsIC8qIDMwMDkgKi8KLSAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzMsIC8qIDMwMTAgKi8gICAgIAorICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMywgLyogMzAxMCAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMV8xLCAvKiAzMDExICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzIsIC8qIDMwMTIgKi8gICAgCisgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzIsIC8qIDMwMTIgKi8KICAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfM18xLCAvKiAzMDEzICovCiAgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzNfMiwgLyogMzAxNCAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8xLCAvKiAzMDE1ICovCkBAIC03MTIsNyArNzE4LDcgQEAKICAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzMsIC8qIDMwMjggKi8KICAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzQsIC8qIDMwMjkgKi8KICAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzUsIC8qIDMwMzAgKi8KLSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfREVSSVZFRF9PS18yXzEsIC8qIDMwMzEgKi8gCisgICAgWE1MX1NDSEVNQVBfQ09TX1NUX0RFUklWRURfT0tfMl8xLCAvKiAzMDMxICovCiAgICAgWE1MX1NDSEVNQVBfQ09TX1NUX0RFUklWRURfT0tfMl8yLCAvKiAzMDMyICovCiAgICAgWE1MX1NDSEVNQVBfUzRTX0VMRU1fTk9UX0FMTE9XRUQsIC8qIDMwMzMgKi8KICAgICBYTUxfU0NIRU1BUF9TNFNfRUxFTV9NSVNTSU5HLCAvKiAzMDM0ICovCkBAIC03MzEsMTQgKzczNywxNCBAQAogICAgIFhNTF9TQ0hFTUFQX0VfUFJPUFNfQ09SUkVDVF80LCAvKiAzMDQ3ICovCiAgICAgWE1MX1NDSEVNQVBfRV9QUk9QU19DT1JSRUNUXzUsIC8qIDMwNDggKi8KICAgICBYTUxfU0NIRU1BUF9FX1BST1BTX0NPUlJFQ1RfNiwgLyogMzA0OSAqLwotICAgIFhNTF9TQ0hFTUFQX1NSQ19JTkNMVURFLCAvKiAzMDUwICovICAgIAorICAgIFhNTF9TQ0hFTUFQX1NSQ19JTkNMVURFLCAvKiAzMDUwICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX0FUVFJJQlVURV8xLCAvKiAzMDUxICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX0FUVFJJQlVURV8yLCAvKiAzMDUyICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX0FUVFJJQlVURV8zXzEsIC8qIDMwNTMgKi8KICAgICBYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzNfMiwgLyogMzA1NCAqLwogICAgIFhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfNCwgLyogMzA1NSAqLwogICAgIFhNTF9TQ0hFTUFQX05PX1hNTE5TLCAvKiAzMDU2ICovCi0gICAgWE1MX1NDSEVNQVBfTk9fWFNJLCAvKiAzMDU3ICovICAgICAgCisgICAgWE1MX1NDSEVNQVBfTk9fWFNJLCAvKiAzMDU3ICovCiAgICAgWE1MX1NDSEVNQVBfQ09TX1ZBTElEX0RFRkFVTFRfMSwgLyogMzA1OCAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19WQUxJRF9ERUZBVUxUXzJfMSwgLyogMzA1OSAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19WQUxJRF9ERUZBVUxUXzJfMl8xLCAvKiAzMDYwICovCkBAIC03NzMsNiArNzc5LDggQEAKICAgICBYTUxfU0NIRU1BUF9BVV9QUk9QU19DT1JSRUNULCAvKiAzMDg4ICovCiAgICAgWE1MX1NDSEVNQVBfQV9QUk9QU19DT1JSRUNUXzMsIC8qIDMwODkgKi8KICAgICBYTUxfU0NIRU1BUF9DT1NfQUxMX0xJTUlURUQsIC8qIDMwOTAgKi8KKyAgICBYTUxfU0NIRU1BVFJPTlZfQVNTRVJUID0gNDAwMCwgLyogNDAwMCAqLworICAgIFhNTF9TQ0hFTUFUUk9OVl9SRVBPUlQsCiAgICAgWE1MX01PRFVMRV9PUEVOID0gNDkwMCwgLyogNDkwMCAqLwogICAgIFhNTF9NT0RVTEVfQ0xPU0UsIC8qIDQ5MDEgKi8KICAgICBYTUxfQ0hFQ0tfRk9VTkRfRUxFTUVOVCA9IDUwMDAsCkBAIC04MzUsNyArODQzLDcgQEAKICAqLwogdHlwZWRlZiB2b2lkIChYTUxDREVDTCAqeG1sR2VuZXJpY0Vycm9yRnVuYykgKHZvaWQgKmN0eCwKIAkJCQkgY29uc3QgY2hhciAqbXNnLAotCSAJCQkgLi4uKTsKKwkJCQkgLi4uKSBBVFRSSUJVVEVfUFJJTlRGKDIsMyk7CiAvKioKICAqIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmM6CiAgKiBAdXNlckRhdGE6ICB1c2VyIHByb3ZpZGVkIGRhdGEgZm9yIHRoZSBlcnJvciBjYWxsYmFjawpAQCAtODUwLDM4ICs4NTgsMzggQEAKICAqIFVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIHJlc2V0IHRoZSB0d28gZ2xvYmFsIHZhcmlhYmxlcwogICogeG1sR2VuZXJpY0Vycm9yIGFuZCB4bWxHZW5lcmljRXJyb3JDb250ZXh0LgogICovCi1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMJKHZvaWQgKmN0eCwKIAkJCQkgeG1sR2VuZXJpY0Vycm9yRnVuYyBoYW5kbGVyKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAgICAgaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jCSh4bWxHZW5lcmljRXJyb3JGdW5jICpoYW5kbGVyKTsKIAotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKICAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jCSh2b2lkICpjdHgsCiAJCQkJIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmMgaGFuZGxlcik7CiAvKgogICogRGVmYXVsdCBtZXNzYWdlIHJvdXRpbmVzIHVzZWQgYnkgU0FYIGFuZCBWYWxpZCBjb250ZXh0IGZvciBlcnJvcgogICogYW5kIHdhcm5pbmcgcmVwb3J0aW5nLgogICovCi1YTUxQVUJGVU4gdm9pZCBYTUxDREVDTAkKK1hNTFBVQkZVTiB2b2lkIFhNTENERUNMCiAgICAgeG1sUGFyc2VyRXJyb3IJCSh2b2lkICpjdHgsCiAJCQkJIGNvbnN0IGNoYXIgKm1zZywKLQkJCQkgLi4uKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENERUNMCQorCQkJCSAuLi4pIEFUVFJJQlVURV9QUklOVEYoMiwzKTsKK1hNTFBVQkZVTiB2b2lkIFhNTENERUNMCiAgICAgeG1sUGFyc2VyV2FybmluZwkJKHZvaWQgKmN0eCwKIAkJCQkgY29uc3QgY2hhciAqbXNnLAotCQkJCSAuLi4pOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0RFQ0wJCisJCQkJIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOworWE1MUFVCRlVOIHZvaWQgWE1MQ0RFQ0wKICAgICB4bWxQYXJzZXJWYWxpZGl0eUVycm9yCSh2b2lkICpjdHgsCiAJCQkJIGNvbnN0IGNoYXIgKm1zZywKLQkJCQkgLi4uKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENERUNMCQorCQkJCSAuLi4pIEFUVFJJQlVURV9QUklOVEYoMiwzKTsKK1hNTFBVQkZVTiB2b2lkIFhNTENERUNMCiAgICAgeG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nCSh2b2lkICpjdHgsCiAJCQkJIGNvbnN0IGNoYXIgKm1zZywKLQkJCQkgLi4uKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCisJCQkJIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOworWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogICAgIHhtbFBhcnNlclByaW50RmlsZUluZm8JKHhtbFBhcnNlcklucHV0UHRyIGlucHV0KTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAgICAgeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dAkoeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQpOwogCiAvKgpAQCAtODk5LDE5ICs5MDcsMTkgQEAKICAgICB4bWxSZXNldEVycm9yCQkoeG1sRXJyb3JQdHIgZXJyKTsKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgIHhtbENvcHlFcnJvcgkJKHhtbEVycm9yUHRyIGZyb20sCi0gICAgCQkJCSB4bWxFcnJvclB0ciB0byk7CisJCQkJIHhtbEVycm9yUHRyIHRvKTsKIAogI2lmZGVmIElOX0xJQlhNTAogLyoKICAqIEludGVybmFsIGNhbGxiYWNrIHJlcG9ydGluZyByb3V0aW5lCiAgKi8KLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwgCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAgICAgX194bWxSYWlzZUVycm9yCQkoeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzY2hhbm5lbCwKLSAgICAJCQkJIHhtbEdlbmVyaWNFcnJvckZ1bmMgY2hhbm5lbCwKLSAgICAJCQkJIHZvaWQgKmRhdGEsCisJCQkJIHhtbEdlbmVyaWNFcnJvckZ1bmMgY2hhbm5lbCwKKwkJCQkgdm9pZCAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmN0eCwKLSAgICAJCQkJIHZvaWQgKm5vZGUsCi0gICAgCQkJCSBpbnQgZG9tYWluLAorCQkJCSB2b2lkICpub2RlLAorCQkJCSBpbnQgZG9tYWluLAogCQkJCSBpbnQgY29kZSwKIAkJCQkgeG1sRXJyb3JMZXZlbCBsZXZlbCwKIAkJCQkgY29uc3QgY2hhciAqZmlsZSwKQEAgLTkyMiwxMCArOTMwLDEwIEBACiAJCQkJIGludCBpbnQxLAogCQkJCSBpbnQgY29sLAogCQkJCSBjb25zdCBjaGFyICptc2csCi0JCQkJIC4uLik7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMIAorCQkJCSAuLi4pIEFUVFJJQlVURV9QUklOVEYoMTYsMTcpOworWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogICAgIF9feG1sU2ltcGxlRXJyb3IJCShpbnQgZG9tYWluLAotICAgIAkJCQkgaW50IGNvZGUsCisJCQkJIGludCBjb2RlLAogCQkJCSB4bWxOb2RlUHRyIG5vZGUsCiAJCQkJIGNvbnN0IGNoYXIgKm1zZywKIAkJCQkgY29uc3QgY2hhciAqZXh0cmEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwveG1sbWVtb3J5LmggYi9pbmNsdWRlL2xpYnhtbC94bWxtZW1vcnkuaAppbmRleCAyMzU3MjFjLi44ZjNiMTA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC94bWxtZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpYnhtbC94bWxtZW1vcnkuaApAQCAtMjAsNyArMjAsNyBAQAogICoKICAqIERFQlVHX01FTU9SWSByZXBsYWNlcyB0aGUgYWxsb2NhdG9yIHdpdGggYSBjb2xsZWN0IGFuZCBkZWJ1ZwogICogc2hlbGwgdG8gdGhlIGxpYmMgYWxsb2NhdG9yLgotICogREVCVUdfTUVNT1JZIHNob3VsZCBvbmx5IGJlIGFjdGl2YXRlZCB3aGVuIGRlYnVnZ2luZyAKKyAqIERFQlVHX01FTU9SWSBzaG91bGQgb25seSBiZSBhY3RpdmF0ZWQgd2hlbiBkZWJ1Z2dpbmcKICAqIGxpYnhtbCBpLmUuIGlmIGxpYnhtbCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggLS13aXRoLWRlYnVnLW1lbSB0b28uCiAgKi8KIC8qICNkZWZpbmUgREVCVUdfTUVNT1JZX0ZSRUVEICovCkBAIC0zNSw3ICszNSw3IEBACiAvKioKICAqIERFQlVHX01FTU9SWV9MT0NBVElPTjoKICAqCi0gKiBERUJVR19NRU1PUllfTE9DQVRJT04gc2hvdWxkIGJlIGFjdGl2YXRlZCBvbmx5IHdoZW4gZGVidWdnaW5nIAorICogREVCVUdfTUVNT1JZX0xPQ0FUSU9OIHNob3VsZCBiZSBhY3RpdmF0ZWQgb25seSB3aGVuIGRlYnVnZ2luZwogICogbGlieG1sIGkuZS4gaWYgbGlieG1sIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgtZGVidWctbWVtIHRvby4KICAqLwogI2lmZGVmIERFQlVHX01FTU9SWV9MT0NBVElPTgpAQCAtNjMsNyArNjMsNyBAQAogICoKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogICovCi10eXBlZGVmIHZvaWQgKihYTUxDQUxMICp4bWxNYWxsb2NGdW5jKShzaXplX3Qgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKihBVFRSSUJVVEVfQUxMT0NfU0laRSgxKSBYTUxDQUxMICp4bWxNYWxsb2NGdW5jKShzaXplX3Qgc2l6ZSk7CiAKIC8qKgogICogeG1sUmVhbGxvY0Z1bmM6CkBAIC0xMDUsMTggKzEwNSwxOCBAQAogCQkJIHhtbE1hbGxvY0Z1bmMgbWFsbG9jRnVuYywKIAkJCSB4bWxSZWFsbG9jRnVuYyByZWFsbG9jRnVuYywKIAkJCSB4bWxTdHJkdXBGdW5jIHN0cmR1cEZ1bmMpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMICAgICAKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCXhtbE1lbUdldAkoeG1sRnJlZUZ1bmMgKmZyZWVGdW5jLAogCQkJIHhtbE1hbGxvY0Z1bmMgKm1hbGxvY0Z1bmMsCiAJCQkgeG1sUmVhbGxvY0Z1bmMgKnJlYWxsb2NGdW5jLAogCQkJIHhtbFN0cmR1cEZ1bmMgKnN0cmR1cEZ1bmMpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMICAgICAKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCXhtbEdjTWVtU2V0dXAJKHhtbEZyZWVGdW5jIGZyZWVGdW5jLAogCQkJIHhtbE1hbGxvY0Z1bmMgbWFsbG9jRnVuYywKIAkJCSB4bWxNYWxsb2NGdW5jIG1hbGxvY0F0b21pY0Z1bmMsCiAJCQkgeG1sUmVhbGxvY0Z1bmMgcmVhbGxvY0Z1bmMsCiAJCQkgeG1sU3RyZHVwRnVuYyBzdHJkdXBGdW5jKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTCAgICAgCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAl4bWxHY01lbUdldAkoeG1sRnJlZUZ1bmMgKmZyZWVGdW5jLAogCQkJIHhtbE1hbGxvY0Z1bmMgKm1hbGxvY0Z1bmMsCiAJCQkgeG1sTWFsbG9jRnVuYyAqbWFsbG9jQXRvbWljRnVuYywKQEAgLTEyNiw0MiArMTI2LDQ0IEBACiAvKgogICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIG1lbW9yeSBsYXllci4KICAqLwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJeG1sSW5pdE1lbW9yeQkodm9pZCk7CiAKLS8qIAorLyoKICAqIENsZWFudXAgb2YgdGhlIG1lbW9yeSBsYXllci4KICAqLwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTCAgICAgICAgICAgICAgICAKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKICAgICAgICAgICAgICAgICB4bWxDbGVhbnVwTWVtb3J5ICAgICAgICAodm9pZCk7CiAvKgogICogVGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSBYTUwgZGVidWcgbWVtb3J5IHdyYXBwZXIuCiAgKi8KLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCXhtbE1lbVVzZWQJKHZvaWQpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJeG1sTWVtQmxvY2tzCSh2b2lkKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJeG1sTWVtRGlzcGxheQkoRklMRSAqZnApOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKKwl4bWxNZW1EaXNwbGF5TGFzdChGSUxFICpmcCwgbG9uZyBuYkJ5dGVzKTsKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAl4bWxNZW1TaG93CShGSUxFICpmcCwgaW50IG5yKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJeG1sTWVtb3J5RHVtcAkodm9pZCk7Ci1YTUxQVUJGVU4gdm9pZCAqIFhNTENBTEwJCi0JeG1sTWVtTWFsbG9jCShzaXplX3Qgc2l6ZSk7Ci1YTUxQVUJGVU4gdm9pZCAqIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCAqIFhNTENBTEwKKwl4bWxNZW1NYWxsb2MJKHNpemVfdCBzaXplKSBBVFRSSUJVVEVfQUxMT0NfU0laRSgxKTsKK1hNTFBVQkZVTiB2b2lkICogWE1MQ0FMTAogCXhtbE1lbVJlYWxsb2MJKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCXhtbE1lbUZyZWUJKHZvaWQgKnB0cik7Ci1YTUxQVUJGVU4gY2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4gY2hhciAqIFhNTENBTEwKIAl4bWxNZW1vcnlTdHJkdXAJKGNvbnN0IGNoYXIgKnN0cik7Ci1YTUxQVUJGVU4gdm9pZCAqIFhNTENBTEwgIAotCXhtbE1hbGxvY0xvYwkoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLVhNTFBVQkZVTiB2b2lkICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB2b2lkICogWE1MQ0FMTAorCXhtbE1hbGxvY0xvYwkoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSBBVFRSSUJVVEVfQUxMT0NfU0laRSgxKTsKK1hNTFBVQkZVTiB2b2lkICogWE1MQ0FMTAogCXhtbFJlYWxsb2NMb2MJKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLVhNTFBVQkZVTiB2b2lkICogWE1MQ0FMTAkKLQl4bWxNYWxsb2NBdG9taWNMb2MgKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci1YTUxQVUJGVU4gY2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4gdm9pZCAqIFhNTENBTEwKKwl4bWxNYWxsb2NBdG9taWNMb2MgKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgQVRUUklCVVRFX0FMTE9DX1NJWkUoMSk7CitYTUxQVUJGVU4gY2hhciAqIFhNTENBTEwKIAl4bWxNZW1TdHJkdXBMb2MJKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3htbHJlYWRlci5oIGIvaW5jbHVkZS9saWJ4bWwveG1scmVhZGVyLmgKaW5kZXggZGZlNTFhMy4uNjk2NDQ4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1scmVhZGVyLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwveG1scmVhZGVyLmgKQEAgLTE4LDEzICsxOCwyNiBAQAogI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiAjZW5kaWYKIAotI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKIC8qKgorICogeG1sUGFyc2VyU2V2ZXJpdGllczoKKyAqCisgKiBIb3cgc2V2ZXJlIGFuIGVycm9yIGNhbGxiYWNrIGlzIHdoZW4gdGhlIHBlci1yZWFkZXIgZXJyb3IgY2FsbGJhY2sgQVBJCisgKiBpcyB1c2VkLgorICovCit0eXBlZGVmIGVudW0geworICAgIFhNTF9QQVJTRVJfU0VWRVJJVFlfVkFMSURJVFlfV0FSTklORyA9IDEsCisgICAgWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9FUlJPUiA9IDIsCisgICAgWE1MX1BBUlNFUl9TRVZFUklUWV9XQVJOSU5HID0gMywKKyAgICBYTUxfUEFSU0VSX1NFVkVSSVRZX0VSUk9SID0gNAorfSB4bWxQYXJzZXJTZXZlcml0aWVzOworCisjaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECisKKy8qKgogICogeG1sVGV4dFJlYWRlck1vZGU6CiAgKgogICogSW50ZXJuYWwgc3RhdGUgdmFsdWVzIGZvciB0aGUgcmVhZGVyLgpAQCAtNDIsNyArNTUsNyBAQAogICogeG1sUGFyc2VyUHJvcGVydGllczoKICAqCiAgKiBTb21lIGNvbW1vbiBvcHRpb25zIHRvIHVzZSB3aXRoIHhtbFRleHRSZWFkZXJTZXRQYXJzZXJQcm9wLCBidXQgaXQKLSAqIGlzIGJldHRlciB0byB1c2UgeG1sUGFyc2VyT3B0aW9uIGFuZCB0aGUgeG1sUmVhZGVyTmV3eHh4IGFuZCAKKyAqIGlzIGJldHRlciB0byB1c2UgeG1sUGFyc2VyT3B0aW9uIGFuZCB0aGUgeG1sUmVhZGVyTmV3eHh4IGFuZAogICogeG1sUmVhZGVyRm9yeHh4IEFQSXMgbm93LgogICovCiB0eXBlZGVmIGVudW0gewpAQCAtNTMsMTkgKzY2LDYgQEAKIH0geG1sUGFyc2VyUHJvcGVydGllczsKIAogLyoqCi0gKiB4bWxQYXJzZXJTZXZlcml0aWVzOgotICoKLSAqIEhvdyBzZXZlcmUgYW4gZXJyb3IgY2FsbGJhY2sgaXMgd2hlbiB0aGUgcGVyLXJlYWRlciBlcnJvciBjYWxsYmFjayBBUEkKLSAqIGlzIHVzZWQuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9XQVJOSU5HID0gMSwKLSAgICBYTUxfUEFSU0VSX1NFVkVSSVRZX1ZBTElESVRZX0VSUk9SID0gMiwKLSAgICBYTUxfUEFSU0VSX1NFVkVSSVRZX1dBUk5JTkcgPSAzLAotICAgIFhNTF9QQVJTRVJfU0VWRVJJVFlfRVJST1IgPSA0Ci19IHhtbFBhcnNlclNldmVyaXRpZXM7Ci0KLS8qKgogICogeG1sUmVhZGVyVHlwZXM6CiAgKgogICogUHJlZGVmaW5lZCBjb25zdGFudHMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2Ygbm9kZXMuCkBAIC0xMTEsMTMgKzExMSwxMyBAQAogWE1MUFVCRlVOIHhtbFRleHRSZWFkZXJQdHIgWE1MQ0FMTAogCQkJeG1sTmV3VGV4dFJlYWRlcgkoeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpVUkkpOwotWE1MUFVCRlVOIHhtbFRleHRSZWFkZXJQdHIgWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxUZXh0UmVhZGVyUHRyIFhNTENBTEwKIAkJCXhtbE5ld1RleHRSZWFkZXJGaWxlbmFtZShjb25zdCBjaGFyICpVUkkpOwogCi1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJCQl4bWxGcmVlVGV4dFJlYWRlcgkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwogCi1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICAgICAgeG1sVGV4dFJlYWRlclNldHVwKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogICAgICAgICAgICAgICAgICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0LCBjb25zdCBjaGFyICpVUkwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsIGludCBvcHRpb25zKTsKQEAgLTEyNSwxMjAgKzEyNSwxMjAgQEAKIC8qCiAgKiBJdGVyYXRvcnMKICAqLwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlclJlYWQJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKIAogI2lmZGVmIExJQlhNTF9XUklURVJfRU5BQkxFRAotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCQl4bWxUZXh0UmVhZGVyUmVhZElubmVyWG1sCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci0JCQkKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKKworWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCQl4bWxUZXh0UmVhZGVyUmVhZE91dGVyWG1sCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAjZW5kaWYKIAotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCQl4bWxUZXh0UmVhZGVyUmVhZFN0cmluZwkJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJSZWFkQXR0cmlidXRlVmFsdWUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKIAogLyoKICAqIEF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUKICAqLwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlckF0dHJpYnV0ZUNvdW50KHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJEZXB0aAkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlckhhc0F0dHJpYnV0ZXMoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlckhhc1ZhbHVlKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJJc0RlZmF1bHQJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJJc0VtcHR5RWxlbWVudCh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCQl4bWxUZXh0UmVhZGVyTm9kZVR5cGUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJRdW90ZUNoYXIJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJSZWFkU3RhdGUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICAgICAgICAgICAgICAgICAgeG1sVGV4dFJlYWRlcklzTmFtZXNwYWNlRGVjbCh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAKLVhNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckNvbnN0QmFzZVVyaQkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3RMb2NhbE5hbWUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckNvbnN0TmFtZQkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lc3BhY2VVcmkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3RQcmVmaXgJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiBjb25zdCB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckNvbnN0WG1sTGFuZwkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3RTdHJpbmcJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAotCQkgICAgCQkJCSBjb25zdCB4bWxDaGFyICpzdHIpOwotWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCQorCQkJCQkJIGNvbnN0IHhtbENoYXIgKnN0cik7CitYTUxQVUJGVU4gY29uc3QgeG1sQ2hhciAqIFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJDb25zdFZhbHVlCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAKIC8qCiAgKiB1c2UgdGhlIENvbnN0IHZlcnNpb24gb2YgdGhlIHJvdXRpbmUgZm9yCiAgKiBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHNpbXBsZXIgY29kZQogICovCi1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJCYXNlVXJpCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJMb2NhbE5hbWUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlck5hbWUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlck5hbWVzcGFjZVVyaSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwJCitYTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwKIAkJCXhtbFRleHRSZWFkZXJQcmVmaXgJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlclhtbExhbmcJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkJeG1sVGV4dFJlYWRlclZhbHVlCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAKIC8qCiAgKiBNZXRob2RzIG9mIHRoZSBYbWxUZXh0UmVhZGVyCiAgKi8KLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJDbG9zZQkJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5vCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKIAkJCQkJCSBpbnQgbm8pOwotWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpuYW1lKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5zCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpsb2NhbE5hbWUsCiAJCQkJCQkgY29uc3QgeG1sQ2hhciAqbmFtZXNwYWNlVVJJKTsKLVhNTFBVQkZVTiB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciBYTUxDQUxMIAorWE1MUFVCRlVOIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJHZXRSZW1haW5kZXIJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpwcmVmaXgpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5vKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogCQkJCQkJIGludCBubyk7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKm5hbWUpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5zKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogCQkJCQkJIGNvbnN0IHhtbENoYXIgKmxvY2FsTmFtZSwKIAkJCQkJCSBjb25zdCB4bWxDaGFyICpuYW1lc3BhY2VVUkkpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlck1vdmVUb0ZpcnN0QXR0cmlidXRlKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJNb3ZlVG9OZXh0QXR0cmlidXRlKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJNb3ZlVG9FbGVtZW50CSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyTm9ybWFsaXphdGlvbgkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwogWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3RFbmNvZGluZyAgKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKQEAgLTI0NiwxNCArMjQ2LDE0IEBACiAvKgogICogRXh0ZW5zaW9ucwogICovCi1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyU2V0UGFyc2VyUHJvcAkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCiAJCQkJCQkgaW50IHByb3AsCiAJCQkJCQkgaW50IHZhbHVlKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJHZXRQYXJzZXJQcm9wCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKIAkJCQkJCSBpbnQgcHJvcCk7Ci1YTUxQVUJGVU4geG1sTm9kZVB0ciBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbE5vZGVQdHIgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTApAQCAtMjYyLDQxICsyNjIsNDEgQEAKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICAgICAgeG1sVGV4dFJlYWRlckdldFBhcnNlckNvbHVtbk51bWJlcih4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CiAKLVhNTFBVQkZVTiB4bWxOb2RlUHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sTm9kZVB0ciBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyUHJlc2VydmUJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKICNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECi1YTUxQVUJGVU4gaW50IFhNTENBTEwJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJQcmVzZXJ2ZVBhdHRlcm4oeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCi0JCSAgICAJCQkJIGNvbnN0IHhtbENoYXIgKnBhdHRlcm4sCisJCQkJCQkgY29uc3QgeG1sQ2hhciAqcGF0dGVybiwKIAkJCQkJCSBjb25zdCB4bWxDaGFyICoqbmFtZXNwYWNlcyk7CiAjZW5kaWYgLyogTElCWE1MX1BBVFRFUk5fRU5BQkxFRCAqLwotWE1MUFVCRlVOIHhtbERvY1B0ciBYTUxDQUxMCQorWE1MUFVCRlVOIHhtbERvY1B0ciBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ3VycmVudERvYwkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwotWE1MUFVCRlVOIHhtbE5vZGVQdHIgWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxOb2RlUHRyIFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJFeHBhbmQJCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyTmV4dAkJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlck5leHRTaWJsaW5nCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQorWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVySXNWYWxpZAkoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIpOwogI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJSZWxheE5HVmFsaWRhdGUoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCiAJCQkJCQkgY29uc3QgY2hhciAqcm5nKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJSZWxheE5HU2V0U2NoZW1hKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogCQkJCQkJIHhtbFJlbGF4TkdQdHIgc2NoZW1hKTsKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlclNjaGVtYVZhbGlkYXRlCSh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKLQkJICAgIAkJCQkgY29uc3QgY2hhciAqeHNkKTsKKwkJCQkJCSBjb25zdCBjaGFyICp4c2QpOwogWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyU2NoZW1hVmFsaWRhdGVDdHh0KHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAogCQkJCQkJIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LAogCQkJCQkJIGludCBvcHRpb25zKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFRleHRSZWFkZXJTZXRTY2hlbWEJKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAotCQkgICAgCQkJCSB4bWxTY2hlbWFQdHIgc2NoZW1hKTsKKwkJCQkJCSB4bWxTY2hlbWFQdHIgc2NoZW1hKTsKICNlbmRpZgogWE1MUFVCRlVOIGNvbnN0IHhtbENoYXIgKiBYTUxDQUxMCiAJCSAgICB4bWxUZXh0UmVhZGVyQ29uc3RYbWxWZXJzaW9uKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKTsKQEAgLTM4MiwzMyArMzgyLDQzIEBACiAgKiBFcnJvciBoYW5kbGluZyBleHRlbnNpb25zCiAgKi8KIHR5cGVkZWYgdm9pZCAqICB4bWxUZXh0UmVhZGVyTG9jYXRvclB0cjsKLXR5cGVkZWYgdm9pZCAgIChYTUxDQUxMICp4bWxUZXh0UmVhZGVyRXJyb3JGdW5jKSAgICAgICAgKHZvaWQgKmFyZywgCisKKy8qKgorICogeG1sVGV4dFJlYWRlckVycm9yRnVuYzoKKyAqIEBhcmc6IHRoZSB1c2VyIGFyZ3VtZW50CisgKiBAbXNnOiB0aGUgbWVzc2FnZQorICogQHNldmVyaXR5OiB0aGUgc2V2ZXJpdHkgb2YgdGhlIGVycm9yCisgKiBAbG9jYXRvcjogYSBsb2NhdG9yIGluZGljYXRpbmcgd2hlcmUgdGhlIGVycm9yIG9jY3VyZWQKKyAqCisgKiBTaWduYXR1cmUgb2YgYW4gZXJyb3IgY2FsbGJhY2sgZnJvbSBhIHJlYWRlciBwYXJzZXIKKyAqLwordHlwZWRlZiB2b2lkICAgKFhNTENBTEwgKnhtbFRleHRSZWFkZXJFcnJvckZ1bmMpKHZvaWQgKmFyZywKIAkJCQkJCSBjb25zdCBjaGFyICptc2csCiAJCQkJCQkgeG1sUGFyc2VyU2V2ZXJpdGllcyBzZXZlcml0eSwKIAkJCQkJCSB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTCAgICAgICAgICAgICAKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyKHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGxvY2F0b3IpOwogLyppbnQgICAgICAgICAgICAgeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lUG9zaXRpb24oeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcik7Ki8KLVhNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTCAgICAgICAKK1hNTFBVQkZVTiB4bWxDaGFyICogWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlckxvY2F0b3JCYXNlVVJJICh4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwgICAgICAgICAgICAKLQkJICAgIHhtbFRleHRSZWFkZXJTZXRFcnJvckhhbmRsZXIoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsIAotCQkJCQkJIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgZiwgCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCisJCSAgICB4bWxUZXh0UmVhZGVyU2V0RXJyb3JIYW5kbGVyKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLAorCQkJCQkJIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgZiwKIAkJCQkJCSB2b2lkICphcmcpOwogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sVGV4dFJlYWRlclNldFN0cnVjdHVyZWRFcnJvckhhbmRsZXIoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCiAJCQkJCQkJICAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBmLAogCQkJCQkJCSAgIHZvaWQgKmFyZyk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMICAgICAgICAgICAgCi0JCSAgICB4bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLCAKLQkJCQkJCSB4bWxUZXh0UmVhZGVyRXJyb3JGdW5jICpmLCAKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKKwkJICAgIHhtbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXIoeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCisJCQkJCQkgeG1sVGV4dFJlYWRlckVycm9yRnVuYyAqZiwKIAkJCQkJCSB2b2lkICoqYXJnKTsKIAorI2VuZGlmIC8qIExJQlhNTF9SRUFERVJfRU5BQkxFRCAqLworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogTElCWE1MX1JFQURFUl9FTkFCTEVEICovCi0KICNlbmRpZiAvKiBfX1hNTF9YTUxSRUFERVJfSF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3htbHJlZ2V4cC5oIGIvaW5jbHVkZS9saWJ4bWwveG1scmVnZXhwLmgKaW5kZXggMDIyY2Q2YS4uNzAwOTY0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1scmVnZXhwLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwveG1scmVnZXhwLmgKQEAgLTM4LDcgKzM4LDcgQEAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9Ci0jZW5kaWYgCisjZW5kaWYKICNpbmNsdWRlIDxsaWJ4bWwvdHJlZS5oPgogI2luY2x1ZGUgPGxpYnhtbC9kaWN0Lmg+CiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTUxLDE2ICs1MSwyMiBAQAogWE1MUFVCRlVOIHhtbFJlZ2V4cFB0ciBYTUxDQUxMCiAJCSAgICB4bWxSZWdleHBDb21waWxlCShjb25zdCB4bWxDaGFyICpyZWdleHApOwogWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCSB4bWxSZWdGcmVlUmVnZXhwKHhtbFJlZ2V4cFB0ciByZWdleHApOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlZ2V4cEV4ZWMJKHhtbFJlZ2V4cFB0ciBjb21wLAogCQkJCQkgY29uc3QgeG1sQ2hhciAqdmFsdWUpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQotICAgIAkJICAgIHhtbFJlZ2V4cFByaW50CShGSUxFICpvdXRwdXQsCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCisJCSAgICB4bWxSZWdleHBQcmludAkoRklMRSAqb3V0cHV0LAogCQkJCQkgeG1sUmVnZXhwUHRyIHJlZ2V4cCk7Ci1YTUxQVUJGVU4gaW50IFhNTENBTEwJCQkKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQkgICAgeG1sUmVnZXhwSXNEZXRlcm1pbmlzdCh4bWxSZWdleHBQdHIgY29tcCk7CiAKLS8qCisvKioKKyAqIHhtbFJlZ0V4ZWNDYWxsYmFja3M6CisgKiBAZXhlYzogdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb250ZXh0CisgKiBAdG9rZW46IHRoZSBjdXJyZW50IHRva2VuIHN0cmluZworICogQHRyYW5zZGF0YTogdHJhbnNpdGlvbiBkYXRhCisgKiBAaW5wdXRkYXRhOiBpbnB1dCBkYXRhCisgKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBkb2luZyBhIHRyYW5zaXRpb24gaW4gdGhlIGF1dG9tYXRhCiAgKi8KIHR5cGVkZWYgdm9pZCAoKnhtbFJlZ0V4ZWNDYWxsYmFja3MpICh4bWxSZWdFeGVjQ3R4dFB0ciBleGVjLApAQCAtNzEsMTcgKzc3LDE3IEBACiAvKgogICogVGhlIHByb2dyZXNzaXZlIEFQSQogICovCi1YTUxQVUJGVU4geG1sUmVnRXhlY0N0eHRQdHIgWE1MQ0FMTAkKLSAgICAJCSAgICB4bWxSZWdOZXdFeGVjQ3R4dAkoeG1sUmVnZXhwUHRyIGNvbXAsCitYTUxQVUJGVU4geG1sUmVnRXhlY0N0eHRQdHIgWE1MQ0FMTAorCQkgICAgeG1sUmVnTmV3RXhlY0N0eHQJKHhtbFJlZ2V4cFB0ciBjb21wLAogCQkJCQkgeG1sUmVnRXhlY0NhbGxiYWNrcyBjYWxsYmFjaywKIAkJCQkJIHZvaWQgKmRhdGEpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCQkgICAgeG1sUmVnRnJlZUV4ZWNDdHh0CSh4bWxSZWdFeGVjQ3R4dFB0ciBleGVjKTsKLVhNTFBVQkZVTiBpbnQgWE1MQ0FMTAkJCQotICAgIAkJICAgIHhtbFJlZ0V4ZWNQdXNoU3RyaW5nKHhtbFJlZ0V4ZWNDdHh0UHRyIGV4ZWMsCitYTUxQVUJGVU4gaW50IFhNTENBTEwKKwkJICAgIHhtbFJlZ0V4ZWNQdXNoU3RyaW5nKHhtbFJlZ0V4ZWNDdHh0UHRyIGV4ZWMsCiAJCQkJCSBjb25zdCB4bWxDaGFyICp2YWx1ZSwKIAkJCQkJIHZvaWQgKmRhdGEpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkJICAgIHhtbFJlZ0V4ZWNQdXNoU3RyaW5nMih4bWxSZWdFeGVjQ3R4dFB0ciBleGVjLAogCQkJCQkgY29uc3QgeG1sQ2hhciAqdmFsdWUsCiAJCQkJCSBjb25zdCB4bWxDaGFyICp2YWx1ZTIsCkBAIC04OSwxNSArOTUsMTUgQEAKIAogWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxSZWdFeGVjTmV4dFZhbHVlcyh4bWxSZWdFeGVjQ3R4dFB0ciBleGVjLAotCQkgICAgCQkJIGludCAqbmJ2YWwsCi0JCSAgICAJCQkgaW50ICpuYm5lZywKKwkJCQkJIGludCAqbmJ2YWwsCisJCQkJCSBpbnQgKm5ibmVnLAogCQkJCQkgeG1sQ2hhciAqKnZhbHVlcywKIAkJCQkJIGludCAqdGVybWluYWwpOwogWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJCSAgICB4bWxSZWdFeGVjRXJySW5mbwkoeG1sUmVnRXhlY0N0eHRQdHIgZXhlYywKLQkJICAgIAkJCSBjb25zdCB4bWxDaGFyICoqc3RyaW5nLAorCQkJCQkgY29uc3QgeG1sQ2hhciAqKnN0cmluZywKIAkJCQkJIGludCAqbmJ2YWwsCi0JCSAgICAJCQkgaW50ICpuYm5lZywKKwkJCQkJIGludCAqbmJuZWcsCiAJCQkJCSB4bWxDaGFyICoqdmFsdWVzLAogCQkJCQkgaW50ICp0ZXJtaW5hbCk7CiAjaWZkZWYgTElCWE1MX0VYUFJfRU5BQkxFRApAQCAtMTM1LDcgKzE0MSw3IEBACiB9IHhtbEV4cE5vZGVUeXBlOwogCiAvKgotICogMiBjb3JlIGV4cHJlc3Npb25zIHNoYXJlZCBieSBhbGwgZm9yIHRoZSBlbXB0eSBsYW5ndWFnZSBzZXQgCisgKiAyIGNvcmUgZXhwcmVzc2lvbnMgc2hhcmVkIGJ5IGFsbCBmb3IgdGhlIGVtcHR5IGxhbmd1YWdlIHNldAogICogYW5kIGZvciB0aGUgc2V0IHdpdGgganVzdCB0aGUgZW1wdHkgdG9rZW4KICAqLwogWE1MUFVCVkFSIHhtbEV4cE5vZGVQdHIgZm9yYmlkZGVuRXhwOwpAQCAtMjA5LDcgKzIxNSw3IEBACiAjZW5kaWYgLyogTElCWE1MX0VYUFJfRU5BQkxFRCAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9Ci0jZW5kaWYgCisjZW5kaWYKIAogI2VuZGlmIC8qIExJQlhNTF9SRUdFWFBfRU5BQkxFRCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnhtbC94bWxzYXZlLmggYi9pbmNsdWRlL2xpYnhtbC94bWxzYXZlLmgKaW5kZXggYzcxYzcxYS4uNDIwMWI0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1sc2F2ZS5oCisrKyBiL2luY2x1ZGUvbGlieG1sL3htbHNhdmUuaApAQCAtMzAsNyArMzAsMTAgQEAKICAgICBYTUxfU0FWRV9GT1JNQVQgICAgID0gMTw8MCwJLyogZm9ybWF0IHNhdmUgb3V0cHV0ICovCiAgICAgWE1MX1NBVkVfTk9fREVDTCAgICA9IDE8PDEsCS8qIGRyb3AgdGhlIHhtbCBkZWNsYXJhdGlvbiAqLwogICAgIFhNTF9TQVZFX05PX0VNUFRZCT0gMTw8MiwgLyogbm8gZW1wdHkgdGFncyAqLwotICAgIFhNTF9TQVZFX05PX1hIVE1MCT0gMTw8MyAgLyogZGlzYWJsZSBYSFRNTDEgc3BlY2lmaWMgcnVsZXMgKi8KKyAgICBYTUxfU0FWRV9OT19YSFRNTAk9IDE8PDMsIC8qIGRpc2FibGUgWEhUTUwxIHNwZWNpZmljIHJ1bGVzICovCisgICAgWE1MX1NBVkVfWEhUTUwJPSAxPDw0LCAvKiBmb3JjZSBYSFRNTDEgc3BlY2lmaWMgcnVsZXMgKi8KKyAgICBYTUxfU0FWRV9BU19YTUwgICAgID0gMTw8NSwgLyogZm9yY2UgWE1MIHNlcmlhbGl6YXRpb24gb24gSFRNTCBkb2MgKi8KKyAgICBYTUxfU0FWRV9BU19IVE1MICAgID0gMTw8NiAgLyogZm9yY2UgSFRNTCBzZXJpYWxpemF0aW9uIG9uIFhNTCBkb2MgKi8KIH0geG1sU2F2ZU9wdGlvbjsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnhtbC94bWxzY2hlbWFzLmggYi9pbmNsdWRlL2xpYnhtbC94bWxzY2hlbWFzLmgKaW5kZXggMTVmYWVmNS4uZWJlZjNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1sc2NoZW1hcy5oCisrKyBiL2luY2x1ZGUvbGlieG1sL3htbHNjaGVtYXMuaApAQCAtNTYsNyArNTYsNyBAQAogCiAvKgogKiBBVFRFTlRJT046IENoYW5nZSB4bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnMncyBjaGVjawotKiBmb3IgaW52YWxpZCB2YWx1ZXMsIGlmIGFkZGluZyB0byB0aGUgdmFsaWRhdGlvbiAKKyogZm9yIGludmFsaWQgdmFsdWVzLCBpZiBhZGRpbmcgdG8gdGhlIHZhbGlkYXRpb24KICogb3B0aW9ucyBiZWxvdy4KICovCiAvKioKQEAgLTg1LDExICs4NSwyOCBAQAogdHlwZWRlZiB4bWxTY2hlbWEgKnhtbFNjaGVtYVB0cjsKIAogLyoqCisgKiB4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYzoKKyAqIEBjdHg6IHRoZSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBtc2c6IHRoZSBtZXNzYWdlCisgKiBALi4uOiBleHRyYSBhcmd1bWVudHMKKyAqCisgKiBTaWduYXR1cmUgb2YgYW4gZXJyb3IgY2FsbGJhY2sgZnJvbSBhbiBYU0QgdmFsaWRhdGlvbgorICovCit0eXBlZGVmIHZvaWQgKFhNTENERUNMICp4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYykgKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbXNnLCAuLi4pIEFUVFJJQlVURV9QUklOVEYoMiwzKTsKKworLyoqCisgKiB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jOgorICogQGN0eDogdGhlIHZhbGlkYXRpb24gY29udGV4dAorICogQG1zZzogdGhlIG1lc3NhZ2UKKyAqIEAuLi46IGV4dHJhIGFyZ3VtZW50cworICoKKyAqIFNpZ25hdHVyZSBvZiBhIHdhcm5pbmcgY2FsbGJhY2sgZnJvbSBhbiBYU0QgdmFsaWRhdGlvbgorICovCit0eXBlZGVmIHZvaWQgKFhNTENERUNMICp4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jKSAodm9pZCAqY3R4LCBjb25zdCBjaGFyICptc2csIC4uLikgQVRUUklCVVRFX1BSSU5URigyLDMpOworCisvKioKICAqIEEgc2NoZW1hcyB2YWxpZGF0aW9uIGNvbnRleHQKICAqLwotdHlwZWRlZiB2b2lkIChYTUxDREVDTCAqeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMpICh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKTsKLXR5cGVkZWYgdm9pZCAoWE1MQ0RFQ0wgKnhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMpICh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKTsKLQogdHlwZWRlZiBzdHJ1Y3QgX3htbFNjaGVtYVBhcnNlckN0eHQgeG1sU2NoZW1hUGFyc2VyQ3R4dDsKIHR5cGVkZWYgeG1sU2NoZW1hUGFyc2VyQ3R4dCAqeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cjsKIApAQCAtOTksMTYgKzExNiwxNiBAQAogLyoKICAqIEludGVyZmFjZXMgZm9yIHBhcnNpbmcuCiAgKi8KLVhNTFBVQkZVTiB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIFhNTENBTEwgCitYTUxQVUJGVU4geG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYU5ld1BhcnNlckN0eHQJKGNvbnN0IGNoYXIgKlVSTCk7Ci1YTUxQVUJGVU4geG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBYTUxDQUxMIAorWE1MUFVCRlVOIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgWE1MQ0FMTAogCSAgICB4bWxTY2hlbWFOZXdNZW1QYXJzZXJDdHh0CShjb25zdCBjaGFyICpidWZmZXIsCiAJCQkJCSBpbnQgc2l6ZSk7CiBYTUxQVUJGVU4geG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYU5ld0RvY1BhcnNlckN0eHQJKHhtbERvY1B0ciBkb2MpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYUZyZWVQYXJzZXJDdHh0CSh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQpOwotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYVNldFBhcnNlckVycm9ycwkoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAogCQkJCQkgeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMgZXJyLAogCQkJCQkgeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYyB3YXJuLApAQCAtMTI1LDE5ICsxNDIsMTkgQEAKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogCQl4bWxTY2hlbWFJc1ZhbGlkCSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCk7CiAKLVhNTFBVQkZVTiB4bWxTY2hlbWFQdHIgWE1MQ0FMTAkKK1hNTFBVQkZVTiB4bWxTY2hlbWFQdHIgWE1MQ0FMTAogCSAgICB4bWxTY2hlbWFQYXJzZQkJKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCk7Ci1YTUxQVUJGVU4gdm9pZCBYTUxDQUxMCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkgICAgeG1sU2NoZW1hRnJlZQkJKHhtbFNjaGVtYVB0ciBzY2hlbWEpOwogI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAotWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAkJCitYTUxQVUJGVU4gdm9pZCBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYUR1bXAJCShGSUxFICpvdXRwdXQsCiAJCQkJCSB4bWxTY2hlbWFQdHIgc2NoZW1hKTsKICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KIC8qCiAgKiBJbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nCiAgKi8KLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQorWE1MUFVCRlVOIHZvaWQgWE1MQ0FMTAogCSAgICB4bWxTY2hlbWFTZXRWYWxpZEVycm9ycwkoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsCiAJCQkJCSB4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYyBlcnIsCiAJCQkJCSB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jIHdhcm4sCkBAIC0xNTcsMTEgKzE3NCwxMSBAQAogWE1MUFVCRlVOIGludCBYTUxDQUxMCiAJICAgIHhtbFNjaGVtYVZhbGlkQ3R4dEdldE9wdGlvbnMoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQpOwogCi1YTUxQVUJGVU4geG1sU2NoZW1hVmFsaWRDdHh0UHRyIFhNTENBTEwJCitYTUxQVUJGVU4geG1sU2NoZW1hVmFsaWRDdHh0UHRyIFhNTENBTEwKIAkgICAgeG1sU2NoZW1hTmV3VmFsaWRDdHh0CSh4bWxTY2hlbWFQdHIgc2NoZW1hKTsKLVhNTFBVQkZVTiB2b2lkIFhNTENBTEwJCQkKK1hNTFBVQkZVTiB2b2lkIFhNTENBTEwKIAkgICAgeG1sU2NoZW1hRnJlZVZhbGlkQ3R4dAkoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQpOwotWE1MUFVCRlVOIGludCBYTUxDQUxMCQkJCitYTUxQVUJGVU4gaW50IFhNTENBTEwKIAkgICAgeG1sU2NoZW1hVmFsaWRhdGVEb2MJKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LAogCQkJCQkgeG1sRG9jUHRyIGluc3RhbmNlKTsKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTApAQCAtMTc4LDggKzE5NSwxMSBAQAogCQkJCQkgY29uc3QgY2hhciAqIGZpbGVuYW1lLAogCQkJCQkgaW50IG9wdGlvbnMpOwogCitYTUxQVUJGVU4geG1sUGFyc2VyQ3R4dFB0ciBYTUxDQUxMCisJICAgIHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQpOworCiAvKgotICogSW50ZXJmYWNlIHRvIGluc2VydCBTY2hlbWFzIFNBWCB2ZWxpZGF0aW9uIGluIGEgU0FYIHN0cmVhbQorICogSW50ZXJmYWNlIHRvIGluc2VydCBTY2hlbWFzIFNBWCB2YWxpZGF0aW9uIGluIGEgU0FYIHN0cmVhbQogICovCiB0eXBlZGVmIHN0cnVjdCBfeG1sU2NoZW1hU0FYUGx1ZyB4bWxTY2hlbWFTQVhQbHVnU3RydWN0OwogdHlwZWRlZiB4bWxTY2hlbWFTQVhQbHVnU3RydWN0ICp4bWxTY2hlbWFTQVhQbHVnUHRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oIGIvaW5jbHVkZS9saWJ4bWwveG1sdmVyc2lvbi5oCmluZGV4IGVlNTI5YzQuLmE5OGUwMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlieG1sL3htbHZlcnNpb24uaAorKysgYi9pbmNsdWRlL2xpYnhtbC94bWx2ZXJzaW9uLmgKQEAgLTI5LDI4ICsyOSwyOCBAQAogICoKICAqIHRoZSB2ZXJzaW9uIHN0cmluZyBsaWtlICIxLjIuMyIKICAqLwotI2RlZmluZSBMSUJYTUxfRE9UVEVEX1ZFUlNJT04gIjIuNi4zMSIKKyNkZWZpbmUgTElCWE1MX0RPVFRFRF9WRVJTSU9OICIyLjcuMyIKIAogLyoqCiAgKiBMSUJYTUxfVkVSU0lPTjoKICAqCiAgKiB0aGUgdmVyc2lvbiBudW1iZXI6IDEuMi4zIHZhbHVlIGlzIDEwMjAzCiAgKi8KLSNkZWZpbmUgTElCWE1MX1ZFUlNJT04gMjA2MzEKKyNkZWZpbmUgTElCWE1MX1ZFUlNJT04gMjA3MDMKIAogLyoqCiAgKiBMSUJYTUxfVkVSU0lPTl9TVFJJTkc6CiAgKgogICogdGhlIHZlcnNpb24gbnVtYmVyIHN0cmluZywgMS4yLjMgdmFsdWUgaXMgIjEwMjAzIgogICovCi0jZGVmaW5lIExJQlhNTF9WRVJTSU9OX1NUUklORyAiMjA2MzEiCisjZGVmaW5lIExJQlhNTF9WRVJTSU9OX1NUUklORyAiMjA3MDMiCiAKIC8qKgogICogTElCWE1MX1ZFUlNJT05fRVhUUkE6CiAgKgogICogZXh0cmEgdmVyc2lvbiBpbmZvcm1hdGlvbiwgdXNlZCB0byBzaG93IGEgQ1ZTIGNvbXBpbGF0aW9uCiAgKi8KLSNkZWZpbmUgTElCWE1MX1ZFUlNJT05fRVhUUkEgIi1DVlMyODMxIgorI2RlZmluZSBMSUJYTUxfVkVSU0lPTl9FWFRSQSAiIgogCiAvKioKICAqIExJQlhNTF9URVNUX1ZFUlNJT046CkBAIC01OCw3ICs1OCw3IEBACiAgKiBNYWNybyB0byBjaGVjayB0aGF0IHRoZSBsaWJ4bWwgdmVyc2lvbiBpbiB1c2UgaXMgY29tcGF0aWJsZSB3aXRoCiAgKiB0aGUgdmVyc2lvbiB0aGUgc29mdHdhcmUgaGFzIGJlZW4gY29tcGlsZWQgYWdhaW5zdAogICovCi0jZGVmaW5lIExJQlhNTF9URVNUX1ZFUlNJT04geG1sQ2hlY2tWZXJzaW9uKDIwNjMxKTsKKyNkZWZpbmUgTElCWE1MX1RFU1RfVkVSU0lPTiB4bWxDaGVja1ZlcnNpb24oMjA3MDMpOwogCiAjaWZuZGVmIFZNUwogI2lmIDAKQEAgLTM3MCw3ICszNzAsNyBAQAogICoKICAqIHRoZSBzdHJpbmcgc3VmZml4IHVzZWQgYnkgZHluYW1pYyBtb2R1bGVzICh1c3VhbGx5IHNoYXJlZCBsaWJyYXJpZXMpCiAgKi8KLSNkZWZpbmUgTElCWE1MX01PRFVMRV9FWFRFTlNJT04gIi5zbyIgCisjZGVmaW5lIExJQlhNTF9NT0RVTEVfRVhURU5TSU9OICIiIAogI2VuZGlmCiAKIC8qKgpAQCAtMzgyLDIyICszODIsNzQgQEAKICNkZWZpbmUgTElCWE1MX1pMSUJfRU5BQkxFRAogI2VuZGlmCiAKKyNpZmRlZiBfX0dOVUNfXworI2lmZGVmIEhBVkVfQU5TSURFQ0xfSAorI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjZW5kaWYKKwogLyoqCiAgKiBBVFRSSUJVVEVfVU5VU0VEOgogICoKICAqIE1hY3JvIHVzZWQgdG8gc2lnbmFsIHRvIEdDQyB1bnVzZWQgZnVuY3Rpb24gcGFyYW1ldGVycwogICovCi0jaWZkZWYgX19HTlVDX18KLSNpZmRlZiBIQVZFX0FOU0lERUNMX0gKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2VuZGlmCisKICNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRAogI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCiAjZW5kaWYKKworLyoqCisgKiBBVFRSSUJVVEVfQUxMT0NfU0laRToKKyAqCisgKiBNYWNybyB1c2VkIHRvIGluZGljYXRlIHRvIEdDQyB0aGlzIGlzIGFuIGFsbG9jYXRvciBmdW5jdGlvbgorICovCisKKyNpZm5kZWYgQVRUUklCVVRFX0FMTE9DX1NJWkUKKyMgaWYgKChfX0dOVUNfXyA+IDQpIHx8ICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSkKKyMgIGRlZmluZSBBVFRSSUJVVEVfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplKHgpKSkKKyMgZWxzZQorIyAgZGVmaW5lIEFUVFJJQlVURV9BTExPQ19TSVpFKHgpCisjIGVuZGlmCiAjZWxzZQotI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VECisjIGRlZmluZSBBVFRSSUJVVEVfQUxMT0NfU0laRSh4KQogI2VuZGlmCiAKKy8qKgorICogQVRUUklCVVRFX1BSSU5URjoKKyAqCisgKiBNYWNybyB1c2VkIHRvIGluZGljYXRlIHRvIEdDQyB0aGUgcGFyYW1ldGVyIGFyZSBwcmludGYgbGlrZQorICovCisKKyNpZm5kZWYgQVRUUklCVVRFX1BSSU5URgorIyBpZiAoKF9fR05VQ19fID4gMykgfHwgKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpKQorIyAgZGVmaW5lIEFUVFJJQlVURV9QUklOVEYoZm10LGFyZ3MpIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXyxmbXQsYXJncykpKQorIyBlbHNlCisjICBkZWZpbmUgQVRUUklCVVRFX1BSSU5URihmbXQsYXJncykKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBBVFRSSUJVVEVfUFJJTlRGKGZtdCxhcmdzKQorI2VuZGlmCisKKyNlbHNlIC8qICEgX19HTlVDX18gKi8KKy8qKgorICogQVRUUklCVVRFX1VOVVNFRDoKKyAqCisgKiBNYWNybyB1c2VkIHRvIHNpZ25hbCB0byBHQ0MgdW51c2VkIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VECisvKioKKyAqIEFUVFJJQlVURV9BTExPQ19TSVpFOgorICoKKyAqIE1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdG8gR0NDIHRoaXMgaXMgYW4gYWxsb2NhdG9yIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgQVRUUklCVVRFX0FMTE9DX1NJWkUoeCkKKy8qKgorICogQVRUUklCVVRFX1BSSU5URjoKKyAqCisgKiBNYWNybyB1c2VkIHRvIGluZGljYXRlIHRvIEdDQyB0aGUgcGFyYW1ldGVyIGFyZSBwcmludGYgbGlrZQorICovCisjZGVmaW5lIEFUVFJJQlVURV9QUklOVEYoZm10LGFyZ3MpCisjZW5kaWYgLyogX19HTlVDX18gKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3htbHdyaXRlci5oIGIvaW5jbHVkZS9saWJ4bWwveG1sd3JpdGVyLmgKaW5kZXggMzFjZWI1Zi4uZGY0NTA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1sd3JpdGVyLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwveG1sd3JpdGVyLmgKQEAgLTY5LDExICs2OSwxMyBAQAogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTCB4bWxUZXh0V3JpdGVyRW5kQ29tbWVudCh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcik7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdENvbW1lbnQoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCQlBVFRSSUJVVEVfUFJJTlRGKDIsMyk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRDb21tZW50KHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdwdHIpCisJCQkJCSBBVFRSSUJVVEVfUFJJTlRGKDIsMCk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMIHhtbFRleHRXcml0ZXJXcml0ZUNvbW1lbnQoeG1sVGV4dFdyaXRlclB0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICoKQEAgLTEwMiwxMiArMTA0LDE0IEBACiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCQlBVFRSSUJVVEVfUFJJTlRGKDMsNCk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRFbGVtZW50KHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncHRyKQorCQkJCQkgQVRUUklCVVRFX1BSSU5URigzLDApOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50KHhtbFRleHRXcml0ZXJQdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCkBAIC0xMTgsMTQgKzEyMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCQkgIEFUVFJJQlVURV9QUklOVEYoNSw2KTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEVsZW1lbnROUyh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cikKKwkJCQkJICAgQVRUUklCVVRFX1BSSU5URig1LDApOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTCB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50TlMoeG1sVGV4dFdyaXRlclB0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqCkBAIC0xNDEsMTAgKzE0NywxMiBAQAogICovCiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdFJhdyh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCSAgICBBVFRSSUJVVEVfUFJJTlRGKDIsMyk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRSYXcoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3B0cikKKwkJCQkgICAgIEFUVFJJQlVURV9QUklOVEYoMiwwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlUmF3TGVuKHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQsIGludCBsZW4pOwpAQCAtMTU0LDEyICsxNjIsMTQgQEAKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0U3RyaW5nKHhtbFRleHRXcml0ZXJQdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LCAuLi4pCisJCQkJCQkJIEFUVFJJQlVURV9QUklOVEYoMiwzKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwgeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFN0cmluZyh4bWxUZXh0V3JpdGVyUHRyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cikKKwkJCQkJCQkgIEFUVFJJQlVURV9QUklOVEYoMiwwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwgeG1sVGV4dFdyaXRlcldyaXRlU3RyaW5nKHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50KTsKQEAgLTE5MywxMiArMjAzLDE0IEBACiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdEF0dHJpYnV0ZSh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQkJCSAgQVRUUklCVVRFX1BSSU5URigzLDQpOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0QXR0cmlidXRlKHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdwdHIpCisJCQkJCSAgIEFUVFJJQlVURV9QUklOVEYoMywwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwgeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHhtbFRleHRXcml0ZXJQdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLApAQCAtMjA5LDE0ICsyMjEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQkJCSAgICBBVFRSSUJVVEVfUFJJTlRGKDUsNik7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRBdHRyaWJ1dGVOUyh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cikKKwkJCQkJICAgICBBVFRSSUJVVEVfUFJJTlRGKDUsMCk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMIHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZU5TKHhtbFRleHRXcml0ZXJQdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICoKQEAgLTI0MiwxMSArMjU2LDEzIEBACiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdFBJKHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCSAgIEFUVFJJQlVURV9QUklOVEYoMyw0KTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFBJKHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3B0cikKKwkJCQkgICAgQVRUUklCVVRFX1BSSU5URigzLDApOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVQSSh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHRhcmdldCwKQEAgLTI3MCwxMCArMjg2LDEyIEBACiAgKi8KICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q0RBVEEoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQkJICAgICAgQVRUUklCVVRFX1BSSU5URigyLDMpOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0Q0RBVEEoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdwdHIpCisJCQkJICAgICAgIEFUVFJJQlVURV9QUklOVEYoMiwwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlQ0RBVEEoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50KTsKQEAgLTI5NiwxMyArMzE0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBwdWJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBzeXNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCSAgICBBVFRSSUJVVEVfUFJJTlRGKDUsNik7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXREVEQoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHB1YmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBzeXNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncHRyKQorCQkJCSAgICAgQVRUUklCVVRFX1BSSU5URig1LDApOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVEVEQoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKQEAgLTMzMiwxMiArMzUyLDE0IEBACiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZUZvcm1hdERUREVsZW1lbnQoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJCQkgICBBVFRSSUJVVEVfUFJJTlRGKDMsNCk7CiAgICAgWE1MUFVCRlVOIGludCBYTUxDQUxMCiAgICAgICAgIHhtbFRleHRXcml0ZXJXcml0ZVZGb3JtYXREVERFbGVtZW50KHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncHRyKQorCQkJCQkgICAgQVRUUklCVVRFX1BSSU5URigzLDApOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTCB4bWxUZXh0V3JpdGVyV3JpdGVEVERFbGVtZW50KHhtbFRleHRXcml0ZXJQdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqCkBAIC0zNjAsMTIgKzM4MiwxNCBAQAogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVERBdHRsaXN0KHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkJCQkJICAgQVRUUklCVVRFX1BSSU5URigzLDQpOwogICAgIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogICAgICAgICB4bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFREQXR0bGlzdCh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cikKKwkJCQkJICAgIEFUVFJJQlVURV9QUklOVEYoMywwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwgeG1sVGV4dFdyaXRlcldyaXRlRFREQXR0bGlzdCh4bWxUZXh0V3JpdGVyUHRyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKgpAQCAtMzg5LDEzICs0MTMsMTUgQEAKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RFRESW50ZXJuYWxFbnRpdHkoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQkJCQkgIEFUVFJJQlVURV9QUklOVEYoNCw1KTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREludGVybmFsRW50aXR5KHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3B0cikKKwkJCQkJCSAgIEFUVFJJQlVURV9QUklOVEYoNCwwKTsKICAgICBYTUxQVUJGVU4gaW50IFhNTENBTEwKICAgICAgICAgeG1sVGV4dFdyaXRlcldyaXRlRFRESW50ZXJuYWxFbnRpdHkoeG1sVGV4dFdyaXRlclB0ciB3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3hwYXRoLmggYi9pbmNsdWRlL2xpYnhtbC94cGF0aC5oCmluZGV4IDcyNWNlYmUuLjFhOWUzMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlieG1sL3hwYXRoLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwveHBhdGguaApAQCAtMjc4LDYgKzI3OCw5IEBACiAgKiAgICAtIHRoZSBzZXQgb2YgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBpbiBzY29wZSBmb3IgdGhlIGV4cHJlc3Npb24gCiAgKiBGb2xsb3dpbmcgdGhlIHN3aXRjaCB0byBoYXNoIHRhYmxlcywgdGhpcyBuZWVkIHRvIGJlIHRyaW1tZWQgdXAgYXQKICAqIHRoZSBuZXh0IGJpbmFyeSBpbmNvbXBhdGlibGUgcmVsZWFzZS4KKyAqIFRoZSBub2RlIG1heSBiZSBtb2RpZmllZCB3aGVuIHRoZSBjb250ZXh0IGlzIHBhc3NlZCB0byBsaWJ4bWwyCisgKiBmb3IgYW4gWFBhdGggZXZhbHVhdGlvbiBzbyB5b3UgbWF5IG5lZWQgdG8gaW5pdGlhbGl6ZSBpdCBhZ2FpbgorICogYmVmb3JlIHRoZSBuZXh0IGNhbGwuCiAgKi8KIAogc3RydWN0IF94bWxYUGF0aENvbnRleHQgewpkaWZmIC0tZ2l0IGEvbGlieG1sLmggYi9saWJ4bWwuaAppbmRleCBmNWM2Mzk0Li4zYzQ0YzgzIDEwMDY0NAotLS0gYS9saWJ4bWwuaAorKysgYi9saWJ4bWwuaApAQCAtNzcsNiArNzcsNyBAQAogICovCiB2b2lkIF9feG1sR2xvYmFsSW5pdE11dGV4TG9jayh2b2lkKTsKIHZvaWQgX194bWxHbG9iYWxJbml0TXV0ZXhVbmxvY2sodm9pZCk7Cit2b2lkIF9feG1sR2xvYmFsSW5pdE11dGV4RGVzdHJveSh2b2lkKTsKIAogI2lmZGVmIElOX0xJQlhNTAogI2lmZGVmIF9fR05VQ19fCmRpZmYgLS1naXQgYS9uYW5vZnRwLmMgYi9uYW5vZnRwLmMKaW5kZXggOGM0ZWE4OC4uYTU0Yjg1YiAxMDA2NDQKLS0tIGEvbmFub2Z0cC5jCisrKyBiL25hbm9mdHAuYwpAQCAtODksNyArODksNyBAQAogICogQSBjb3VwbGUgcG9ydGFiaWxpdHkgbWFjcm9zCiAgKi8KICNpZm5kZWYgX1dJTlNPQ0tBUElfCi0jaWZuZGVmIF9fQkVPU19fCisjaWYgIWRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQoX19IQUlLVV9fKQogI2RlZmluZSBjbG9zZXNvY2tldChzKSBjbG9zZShzKQogI2VuZGlmCiAjZGVmaW5lIFNPQ0tFVCBpbnQKZGlmZiAtLWdpdCBhL25hbm9odHRwLmMgYi9uYW5vaHR0cC5jCmluZGV4IDkxYzdlODcuLjkwMDFhZTUgMTAwNjQ0Ci0tLSBhL25hbm9odHRwLmMKKysrIGIvbmFub2h0dHAuYwpAQCAtOTUsNyArOTUsNyBAQAogICogQSBjb3VwbGUgcG9ydGFiaWxpdHkgbWFjcm9zCiAgKi8KICNpZm5kZWYgX1dJTlNPQ0tBUElfCi0jaWZuZGVmIF9fQkVPU19fCisjaWYgIWRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQoX19IQUlLVV9fKQogI2RlZmluZSBjbG9zZXNvY2tldChzKSBjbG9zZShzKQogI2VuZGlmCiAjZGVmaW5lIFNPQ0tFVCBpbnQKQEAgLTg0NCw3ICs4NDQsNyBAQAogCXN0YXR1cyA9IGlvY3RsKHMsIEZJT05CSU8sICZlbmFibGUpOwogICAgIH0KICNlbHNlIC8qIFZNUyAqLwotI2lmIGRlZmluZWQoX19CRU9TX18pCisjaWYgZGVmaW5lZChfX0JFT1NfXykgJiYgIWRlZmluZWQoX19IQUlLVV9fKQogCXsKIAkJYm9vbCBub2Jsb2NrID0gdHJ1ZTsKIAkJc3RhdHVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19OT05CTE9DSywgJm5vYmxvY2ssIHNpemVvZihub2Jsb2NrKSk7CkBAIC0xMzMyLDEzICsxMzMyLDIzIEBACiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkKIAlibGVuICs9IHN0cmxlbihoZWFkZXJzKSArIDI7CiAgICAgaWYgKGNvbnRlbnRUeXBlICYmICpjb250ZW50VHlwZSkKKwkvKiByZXNlcnZlIGZvciBzdHJpbmcgcGx1cyAnQ29udGVudC1UeXBlOiBcclxuIiAqLwogCWJsZW4gKz0gc3RybGVuKCpjb250ZW50VHlwZSkgKyAxNjsKICAgICBpZiAoY3R4dC0+cXVlcnkgIT0gTlVMTCkKKwkvKiAxIGZvciAnPycgKi8KIAlibGVuICs9IHN0cmxlbihjdHh0LT5xdWVyeSkgKyAxOwogICAgIGJsZW4gKz0gc3RybGVuKG1ldGhvZCkgKyBzdHJsZW4oY3R4dC0+cGF0aCkgKyAyNDsKICNpZmRlZiBIQVZFX1pMSUJfSAorICAgIC8qIHJlc2VydmUgZm9yIHBvc3NpYmxlICdBY2NlcHQtRW5jb2Rpbmc6IGd6aXAnIHN0cmluZyAqLwogICAgIGJsZW4gKz0gMjM7CiAjZW5kaWYKKyAgICBpZiAoY3R4dC0+cG9ydCAhPSA4MCkgeworCS8qIHJlc2VydmUgc3BhY2UgZm9yICc6eHh4eHgnLCBpbmNsLiBwb3RlbnRpYWwgcHJveHkgKi8KKwlpZiAocHJveHkpCisJICAgIGJsZW4gKz0gMTI7CisJZWxzZQorCSAgICBibGVuICs9IDY7CisgICAgfQogICAgIGJwID0gKGNoYXIqKXhtbE1hbGxvY0F0b21pYyhibGVuKTsKICAgICBpZiAoIGJwID09IE5VTEwgKSB7CiAgICAgICAgIHhtbE5hbm9IVFRQRnJlZUN0eHQoIGN0eHQgKTsKZGlmZiAtLWdpdCBhL3BhcnNlci5jIGIvcGFyc2VyLmMKaW5kZXggNTI5ZTA2MS4uOWRiNjY0ZiAxMDA2NDQKLS0tIGEvcGFyc2VyLmMKKysrIGIvcGFyc2VyLmMKQEAgLTgwLDIwICs4MCwxMTEgQEAKICNpbmNsdWRlIDx6bGliLmg+CiAjZW5kaWYKIAorc3RhdGljIHZvaWQKK3htbEZhdGFsRXJyKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgeG1sUGFyc2VyRXJyb3JzIGVycm9yLCBjb25zdCBjaGFyICppbmZvKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkqCisgKglBcmJpdHJhcnkgbGltaXRzIHNldCBpbiB0aGUgcGFyc2VyLiBTZWUgWE1MX1BBUlNFX0hVR0UJCSoKKyAqCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYTUxfUEFSU0VSX0JJR19FTlRJVFkgMTAwMAorI2RlZmluZSBYTUxfUEFSU0VSX0xPVF9FTlRJVFkgNTAwMAorCisvKgorICogWE1MX1BBUlNFUl9OT05fTElORUFSIGlzIHRoZSB0aHJlc2hvbGQgd2hlcmUgdGhlIHJhdGlvIG9mIHBhcnNlZCBlbnRpdHkKKyAqICAgIHJlcGxhY2VtZW50IG92ZXIgdGhlIHNpemUgaW4gYnl0ZSBvZiB0aGUgaW5wdXQgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUKKyAqICAgIGFuZCBlcG9uZW50aWFsIGJlaGF2aW91ci4gQSB2YWx1ZSBvZiAxMCBjb3JyZXNwb25kIHRvIGF0IGxlYXN0IDMgZW50aXR5CisgKiAgICByZXBsYWNlbWVudCBwZXIgYnl0ZSBvZiBpbnB1dC4KKyAqLworI2RlZmluZSBYTUxfUEFSU0VSX05PTl9MSU5FQVIgMTAKKworLyoKKyAqIHhtbFBhcnNlckVudGl0eUNoZWNrCisgKgorICogRnVuY3Rpb24gdG8gY2hlY2sgbm9uLWxpbmVhciBlbnRpdHkgZXhwYW5zaW9uIGJlaGF2aW91cgorICogVGhpcyBpcyBoZXJlIHRvIGRldGVjdCBhbmQgc3RvcCBleHBvbmVudGlhbCBsaW5lYXIgZW50aXR5IGV4cGFuc2lvbgorICogVGhpcyBpcyBub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBwYXJzZXIgYnV0IGEgc2FmZXR5CisgKiBib3VuZGFyeSBmZWF0dXJlLiBJdCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgWE1MX1BBUlNFX0hVR0UKKyAqIHBhcnNlciBvcHRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlckVudGl0eUNoZWNrKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgdW5zaWduZWQgbG9uZyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgeG1sRW50aXR5UHRyIGVudCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGNvbnN1bWVkID0gMDsKKworICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9IVUdFKSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICBpZiAoY3R4dC0+bGFzdEVycm9yLmNvZGUgPT0gWE1MX0VSUl9FTlRJVFlfTE9PUCkKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIERvIHRoZSBjaGVjayBiYXNlZCBvbiB0aGUgcmVwbGFjZW1lbnQgc2l6ZSBvZiB0aGUgZW50aXR5CisgICAgICAgICAqLworICAgICAgICBpZiAoc2l6ZSA8IFhNTF9QQVJTRVJfQklHX0VOVElUWSkKKwkgICAgcmV0dXJuKDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEEgbGltaXQgb24gdGhlIGFtb3VudCBvZiB0ZXh0IGRhdGEgcmVhc29uYWJseSB1c2VkCisgICAgICAgICAqLworICAgICAgICBpZiAoY3R4dC0+aW5wdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgY29uc3VtZWQgPSBjdHh0LT5pbnB1dC0+Y29uc3VtZWQgKworICAgICAgICAgICAgICAgIChjdHh0LT5pbnB1dC0+Y3VyIC0gY3R4dC0+aW5wdXQtPmJhc2UpOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVkICs9IGN0eHQtPnNpemVlbnRpdGllczsKKworICAgICAgICBpZiAoKHNpemUgPCBYTUxfUEFSU0VSX05PTl9MSU5FQVIgKiBjb25zdW1lZCkgJiYKKwkgICAgKGN0eHQtPm5iZW50aXRpZXMgKiAzIDwgWE1MX1BBUlNFUl9OT05fTElORUFSICogY29uc3VtZWQpKQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKGVudCAhPSBOVUxMKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIHVzZSB0aGUgbnVtYmVyIG9mIHBhcnNlZCBlbnRpdGllcyBpbiB0aGUgcmVwbGFjZW1lbnQKKyAgICAgICAgICovCisgICAgICAgIHNpemUgPSBlbnQtPmNoZWNrZWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGFtb3VudCBvZiBkYXRhIHBhcnNlZCBjb3VudGluZyBlbnRpdGllcyBzaXplIG9ubHkgb25jZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGN0eHQtPmlucHV0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN1bWVkID0gY3R4dC0+aW5wdXQtPmNvbnN1bWVkICsKKyAgICAgICAgICAgICAgICAoY3R4dC0+aW5wdXQtPmN1ciAtIGN0eHQtPmlucHV0LT5iYXNlKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lZCArPSBjdHh0LT5zaXplZW50aXRpZXM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGRlbnNpdHkgb2YgZW50aXRpZXMgZm9yIHRoZSBhbW91bnQgb2YgZGF0YQorCSAqIGtub3dpbmcgYW4gZW50aXR5IHJlZmVyZW5jZSB3aWxsIHRha2UgYXQgbGVhc3QgMyBieXRlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNpemUgKiAzIDwgY29uc3VtZWQgKiBYTUxfUEFSU0VSX05PTl9MSU5FQVIpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIHN0cmFuZ2Ugd2UgZ290IG5vIGRhdGEgZm9yIGNoZWNraW5nIGp1c3QgcmV0dXJuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAgIHhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfRU5USVRZX0xPT1AsIE5VTEwpOworICAgIHJldHVybiAoMSk7Cit9CisKIC8qKgogICogeG1sUGFyc2VyTWF4RGVwdGg6CiAgKgotICogYXJiaXRyYXJ5IGRlcHRoIGxpbWl0IGZvciB0aGUgWE1MIGRvY3VtZW50cyB0aGF0IHdlIGFsbG93IHRvIAotICogcHJvY2Vzcy4gVGhpcyBpcyBub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBwYXJzZXIgYnV0IGEgc2FmZXR5IAotICogYm91bmRhcnkgZmVhdHVyZS4KKyAqIGFyYml0cmFyeSBkZXB0aCBsaW1pdCBmb3IgdGhlIFhNTCBkb2N1bWVudHMgdGhhdCB3ZSBhbGxvdyB0bworICogcHJvY2Vzcy4gVGhpcyBpcyBub3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBwYXJzZXIgYnV0IGEgc2FmZXR5CisgKiBib3VuZGFyeSBmZWF0dXJlLiBJdCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgWE1MX1BBUlNFX0hVR0UKKyAqIHBhcnNlciBvcHRpb24uCiAgKi8KLXVuc2lnbmVkIGludCB4bWxQYXJzZXJNYXhEZXB0aCA9IDEwMjQ7Cit1bnNpZ25lZCBpbnQgeG1sUGFyc2VyTWF4RGVwdGggPSAyNTY7CisKKwogCiAjZGVmaW5lIFNBWDIgMQotCiAjZGVmaW5lIFhNTF9QQVJTRVJfQklHX0JVRkZFUl9TSVpFIDMwMAogI2RlZmluZSBYTUxfUEFSU0VSX0JVRkZFUl9TSVpFIDEwMAotCiAjZGVmaW5lIFNBWF9DT01QQVRfTU9ERSBCQURfQ0FTVCAiU0FYIGNvbXBhdGliaWxpdHkgbW9kZSBkb2N1bWVudCIKIAogLyoKQEAgLTExNiw2ICsyMDcsOSBAQAogCQkgICAgICB2b2lkICp1c2VyX2RhdGEsIGludCBkZXB0aCwgY29uc3QgeG1sQ2hhciAqVVJMLAogCQkgICAgICBjb25zdCB4bWxDaGFyICpJRCwgeG1sTm9kZVB0ciAqbGlzdCk7CiAKK3N0YXRpYyBpbnQKK3htbEN0eHRVc2VPcHRpb25zSW50ZXJuYWwoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBpbnQgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcpOwogI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogc3RhdGljIHZvaWQKIHhtbEFkZEVudGl0eVJlZmVyZW5jZSh4bWxFbnRpdHlQdHIgZW50LCB4bWxOb2RlUHRyIGZpcnN0Tm9kZSwKQEAgLTEyNiw2ICsyMjAsOSBAQAogeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5SW50ZXJuYWwoeG1sUGFyc2VyQ3R4dFB0ciBvbGRjdHh0LAogCQkgICAgICBjb25zdCB4bWxDaGFyICpzdHJpbmcsIHZvaWQgKnVzZXJfZGF0YSwgeG1sTm9kZVB0ciAqbHN0KTsKIAorc3RhdGljIGludAoreG1sTG9hZEVudGl0eUNvbnRlbnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxFbnRpdHlQdHIgZW50aXR5KTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCiAgKiAJCVNvbWUgZmFjdG9yaXplZCBlcnJvciByb3V0aW5lcwkJCQkqCkBAIC00MTUsNyArNTEyLDcgQEAKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnLCBjb25zdCB4bWxDaGFyICpzdHIxLCBjb25zdCB4bWxDaGFyICpzdHIyKQogewogICAgIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmMgc2NoYW5uZWwgPSBOVUxMOwotICAgIAorCiAgICAgaWYgKChjdHh0ICE9IE5VTEwpICYmIChjdHh0LT5kaXNhYmxlU0FYICE9IDApICYmCiAgICAgICAgIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKSkKIAlyZXR1cm47CkBAIC00NDIsNyArNTM5LDcgQEAKICAqLwogc3RhdGljIHZvaWQKIHhtbFZhbGlkaXR5RXJyb3IoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxQYXJzZXJFcnJvcnMgZXJyb3IsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgeG1sQ2hhciAqc3RyMSkKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnLCBjb25zdCB4bWxDaGFyICpzdHIxLCBjb25zdCB4bWxDaGFyICpzdHIyKQogewogICAgIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmMgc2NoYW5uZWwgPSBOVUxMOwogCkBAIC00NTgsOCArNTU1LDggQEAKICAgICAgICAgICAgICAgICAgICAgY3R4dC0+dmN0eHQuZXJyb3IsIGN0eHQtPnZjdHh0LnVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICBjdHh0LCBOVUxMLCBYTUxfRlJPTV9EVEQsIGVycm9yLAogICAgICAgICAgICAgICAgICAgICBYTUxfRVJSX0VSUk9SLCBOVUxMLCAwLCAoY29uc3QgY2hhciAqKSBzdHIxLAotCQkgICAgTlVMTCwgTlVMTCwgMCwgMCwKLQkJICAgIG1zZywgKGNvbnN0IGNoYXIgKikgc3RyMSk7CisJCSAgICAoY29uc3QgY2hhciAqKSBzdHIyLCBOVUxMLCAwLCAwLAorCQkgICAgbXNnLCAoY29uc3QgY2hhciAqKSBzdHIxLCAoY29uc3QgY2hhciAqKSBzdHIyKTsKICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7CiAJY3R4dC0+dmFsaWQgPSAwOwogICAgIH0KQEAgLTYwNyw2ICs3MDQsMzMgQEAKIAljdHh0LT5uc1dlbGxGb3JtZWQgPSAwOwogfQogCisvKioKKyAqIHhtbE5zV2FybgorICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKKyAqIEBlcnJvcjogIHRoZSBlcnJvciBudW1iZXIKKyAqIEBtc2c6ICB0aGUgbWVzc2FnZQorICogQGluZm8xOiAgZXh0cmEgaW5mb3JtYXRpb24gc3RyaW5nCisgKiBAaW5mbzI6ICBleHRyYSBpbmZvcm1hdGlvbiBzdHJpbmcKKyAqCisgKiBIYW5kbGUgYSBmYXRhbCBwYXJzZXIgZXJyb3IsIGkuZS4gdmlvbGF0aW5nIFdlbGwtRm9ybWVkbmVzcyBjb25zdHJhaW50cworICovCitzdGF0aWMgdm9pZAoreG1sTnNXYXJuKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAorICAgICAgICAgY29uc3QgY2hhciAqbXNnLAorICAgICAgICAgY29uc3QgeG1sQ2hhciAqIGluZm8xLCBjb25zdCB4bWxDaGFyICogaW5mbzIsCisgICAgICAgICBjb25zdCB4bWxDaGFyICogaW5mbzMpCit7CisgICAgaWYgKChjdHh0ICE9IE5VTEwpICYmIChjdHh0LT5kaXNhYmxlU0FYICE9IDApICYmCisgICAgICAgIChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfRU9GKSkKKwlyZXR1cm47CisgICAgaWYgKGN0eHQgIT0gTlVMTCkKKwljdHh0LT5lcnJObyA9IGVycm9yOworICAgIF9feG1sUmFpc2VFcnJvcihOVUxMLCBOVUxMLCBOVUxMLCBjdHh0LCBOVUxMLCBYTUxfRlJPTV9OQU1FU1BBQ0UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBYTUxfRVJSX1dBUk5JTkcsIE5VTEwsIDAsIChjb25zdCBjaGFyICopIGluZm8xLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSBpbmZvMiwgKGNvbnN0IGNoYXIgKikgaW5mbzMsIDAsIDAsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgaW5mbzEsIGluZm8yLCBpbmZvMyk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgogICogCQlMaWJyYXJ5IHdpZGUgb3B0aW9ucwkJCQkJKgpAQCAtODA2LDcgKzkzMCw3IEBACiAgICAgICAgICAgICByZXR1cm4oMSk7CiAjZWxzZQogICAgICAgICAgICAgcmV0dXJuKDApOwotI2VuZGlmIAorI2VuZGlmCiAgICAgICAgIGNhc2UgWE1MX1dJVEhfWkxJQjoKICNpZmRlZiBMSUJYTUxfWkxJQl9FTkFCTEVECiAgICAgICAgICAgICByZXR1cm4oMSk7CkBAIC04NTYsMTAgKzk4MCwxMDggQEAKIHN0cnVjdCBfeG1sRGVmQXR0cnMgewogICAgIGludCBuYkF0dHJzOwkvKiBudW1iZXIgb2YgZGVmYXVsdGVkIGF0dHJpYnV0ZXMgb24gdGhhdCBlbGVtZW50ICovCiAgICAgaW50IG1heEF0dHJzOyAgICAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KLSAgICBjb25zdCB4bWxDaGFyICp2YWx1ZXNbNF07IC8qIGFycmF5IG9mIGxvY2FsbmFtZS9wcmVmaXgvdmFsdWVzICovCisgICAgY29uc3QgeG1sQ2hhciAqdmFsdWVzWzVdOyAvKiBhcnJheSBvZiBsb2NhbG5hbWUvcHJlZml4L3ZhbHVlcy9leHRlcm5hbCAqLwogfTsKIAogLyoqCisgKiB4bWxBdHRyTm9ybWFsaXplU3BhY2U6CisgKiBAc3JjOiB0aGUgc291cmNlIHN0cmluZworICogQGRzdDogdGhlIHRhcmdldCBzdHJpbmcKKyAqCisgKiBOb3JtYWxpemUgdGhlIHNwYWNlIGluIG5vbiBDREFUQSBhdHRyaWJ1dGUgdmFsdWVzOgorICogSWYgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBDREFUQSwgdGhlbiB0aGUgWE1MIHByb2Nlc3NvciBNVVNUIGZ1cnRoZXIKKyAqIHByb2Nlc3MgdGhlIG5vcm1hbGl6ZWQgYXR0cmlidXRlIHZhbHVlIGJ5IGRpc2NhcmRpbmcgYW55IGxlYWRpbmcgYW5kCisgKiB0cmFpbGluZyBzcGFjZSAoI3gyMCkgY2hhcmFjdGVycywgYW5kIGJ5IHJlcGxhY2luZyBzZXF1ZW5jZXMgb2Ygc3BhY2UKKyAqICgjeDIwKSBjaGFyYWN0ZXJzIGJ5IGEgc2luZ2xlIHNwYWNlICgjeDIwKSBjaGFyYWN0ZXIuCisgKiBOb3RlIHRoYXQgdGhlIHNpemUgb2YgZHN0IG5lZWQgdG8gYmUgYXQgbGVhc3Qgc3JjLCBhbmQgaWYgb25lIGRvZXNuJ3QgbmVlZAorICogdG8gcHJlc2VydmUgZHN0IChhbmQgaXQgZG9lc24ndCBjb21lIGZyb20gYSBkaWN0aW9uYXJ5IG9yIHJlYWQtb25seSkgdGhlbgorICogcGFzc2luZyBzcmMgYXMgZHN0IGlzIGp1c3QgZmluZS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbm9ybWFsaXplZCB2YWx1ZSAoZHN0KSBvciBOVUxMIGlmIG5vIGNvbnZlcnNpb24KKyAqICAgICAgICAgaXMgbmVlZGVkLgorICovCitzdGF0aWMgeG1sQ2hhciAqCit4bWxBdHRyTm9ybWFsaXplU3BhY2UoY29uc3QgeG1sQ2hhciAqc3JjLCB4bWxDaGFyICpkc3QpCit7CisgICAgaWYgKChzcmMgPT0gTlVMTCkgfHwgKGRzdCA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworCisgICAgd2hpbGUgKCpzcmMgPT0gMHgyMCkgc3JjKys7CisgICAgd2hpbGUgKCpzcmMgIT0gMCkgeworCWlmICgqc3JjID09IDB4MjApIHsKKwkgICAgd2hpbGUgKCpzcmMgPT0gMHgyMCkgc3JjKys7CisJICAgIGlmICgqc3JjICE9IDApCisJCSpkc3QrKyA9IDB4MjA7CisJfSBlbHNlIHsKKwkgICAgKmRzdCsrID0gKnNyYysrOworCX0KKyAgICB9CisgICAgKmRzdCA9IDA7CisgICAgaWYgKGRzdCA9PSBzcmMpCisgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybihkc3QpOworfQorCisvKioKKyAqIHhtbEF0dHJOb3JtYWxpemVTcGFjZTI6CisgKiBAc3JjOiB0aGUgc291cmNlIHN0cmluZworICoKKyAqIE5vcm1hbGl6ZSB0aGUgc3BhY2UgaW4gbm9uIENEQVRBIGF0dHJpYnV0ZSB2YWx1ZXMsIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGV4CisgKiBmcm9udCBlbmQgdG8gYXZvaWQgYWxsb2NhdGlvbiBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gYXR0cmlidXRlIHZhbHVlcworICogY29taW5nIGZyb20gdGhlIGlucHV0LgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBub3JtYWxpemVkIHZhbHVlIChkc3QpIG9yIE5VTEwgaWYgbm8gY29udmVyc2lvbgorICogICAgICAgICBpcyBuZWVkZWQuCisgKi8KK3N0YXRpYyBjb25zdCB4bWxDaGFyICoKK3htbEF0dHJOb3JtYWxpemVTcGFjZTIoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxDaGFyICpzcmMsIGludCAqbGVuKQoreworICAgIGludCBpOworICAgIGludCByZW1vdmVfaGVhZCA9IDA7CisgICAgaW50IG5lZWRfcmVhbGxvYyA9IDA7CisgICAgY29uc3QgeG1sQ2hhciAqY3VyOworCisgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChzcmMgPT0gTlVMTCkgfHwgKGxlbiA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIGkgPSAqbGVuOworICAgIGlmIChpIDw9IDApCisgICAgICAgIHJldHVybihOVUxMKTsKKworICAgIGN1ciA9IHNyYzsKKyAgICB3aGlsZSAoKmN1ciA9PSAweDIwKSB7CisgICAgICAgIGN1cisrOworCXJlbW92ZV9oZWFkKys7CisgICAgfQorICAgIHdoaWxlICgqY3VyICE9IDApIHsKKwlpZiAoKmN1ciA9PSAweDIwKSB7CisJICAgIGN1cisrOworCSAgICBpZiAoKCpjdXIgPT0gMHgyMCkgfHwgKCpjdXIgPT0gMCkpIHsKKwkgICAgICAgIG5lZWRfcmVhbGxvYyA9IDE7CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlCisJICAgIGN1cisrOworICAgIH0KKyAgICBpZiAobmVlZF9yZWFsbG9jKSB7CisgICAgICAgIHhtbENoYXIgKnJldDsKKworCXJldCA9IHhtbFN0cm5kdXAoc3JjICsgcmVtb3ZlX2hlYWQsIGkgLSByZW1vdmVfaGVhZCArIDEpOworCWlmIChyZXQgPT0gTlVMTCkgeworCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisJeG1sQXR0ck5vcm1hbGl6ZVNwYWNlKHJldCwgcmV0KTsKKwkqbGVuID0gKGludCkgc3RybGVuKChjb25zdCBjaGFyICopcmV0KTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgfSBlbHNlIGlmIChyZW1vdmVfaGVhZCkgeworICAgICAgICAqbGVuIC09IHJlbW92ZV9oZWFkOworICAgICAgICBtZW1tb3ZlKHNyYywgc3JjICsgcmVtb3ZlX2hlYWQsIDEgKyAqbGVuKTsKKwlyZXR1cm4oc3JjKTsKKyAgICB9CisgICAgcmV0dXJuKE5VTEwpOworfQorCisvKioKICAqIHhtbEFkZERlZkF0dHJzOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKICAqIEBmdWxsbmFtZTogIHRoZSBlbGVtZW50IGZ1bGxuYW1lCkBAIC04NzgsNiArMTEwMCwxNCBAQAogICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7CiAgICAgY29uc3QgeG1sQ2hhciAqcHJlZml4OwogCisgICAgLyoKKyAgICAgKiBBbGxvd3MgdG8gZGV0ZWN0IGF0dHJpYnV0ZSByZWRlZmluaXRpb25zCisgICAgICovCisgICAgaWYgKGN0eHQtPmF0dHNTcGVjaWFsICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHhtbEhhc2hMb29rdXAyKGN0eHQtPmF0dHNTcGVjaWFsLCBmdWxsbmFtZSwgZnVsbGF0dHIpICE9IE5VTEwpCisJICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoY3R4dC0+YXR0c0RlZmF1bHQgPT0gTlVMTCkgewogICAgICAgICBjdHh0LT5hdHRzRGVmYXVsdCA9IHhtbEhhc2hDcmVhdGVEaWN0KDEwLCBjdHh0LT5kaWN0KTsKIAlpZiAoY3R4dC0+YXR0c0RlZmF1bHQgPT0gTlVMTCkKQEAgLTkwMywyMiArMTEzMywzMCBAQAogICAgIGRlZmF1bHRzID0geG1sSGFzaExvb2t1cDIoY3R4dC0+YXR0c0RlZmF1bHQsIG5hbWUsIHByZWZpeCk7CiAgICAgaWYgKGRlZmF1bHRzID09IE5VTEwpIHsKICAgICAgICAgZGVmYXVsdHMgPSAoeG1sRGVmQXR0cnNQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sRGVmQXR0cnMpICsKLQkgICAgICAgICAgICAgICAgICAgKDQgKiA0KSAqIHNpemVvZihjb25zdCB4bWxDaGFyICopKTsKKwkgICAgICAgICAgICAgICAgICAgKDQgKiA1KSAqIHNpemVvZihjb25zdCB4bWxDaGFyICopKTsKIAlpZiAoZGVmYXVsdHMgPT0gTlVMTCkKIAkgICAgZ290byBtZW1fZXJyb3I7CiAJZGVmYXVsdHMtPm5iQXR0cnMgPSAwOwogCWRlZmF1bHRzLT5tYXhBdHRycyA9IDQ7Ci0JeG1sSGFzaFVwZGF0ZUVudHJ5MihjdHh0LT5hdHRzRGVmYXVsdCwgbmFtZSwgcHJlZml4LCBkZWZhdWx0cywgTlVMTCk7CisJaWYgKHhtbEhhc2hVcGRhdGVFbnRyeTIoY3R4dC0+YXR0c0RlZmF1bHQsIG5hbWUsIHByZWZpeCwKKwkgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cywgTlVMTCkgPCAwKSB7CisJICAgIHhtbEZyZWUoZGVmYXVsdHMpOworCSAgICBnb3RvIG1lbV9lcnJvcjsKKwl9CiAgICAgfSBlbHNlIGlmIChkZWZhdWx0cy0+bmJBdHRycyA+PSBkZWZhdWx0cy0+bWF4QXR0cnMpIHsKICAgICAgICAgeG1sRGVmQXR0cnNQdHIgdGVtcDsKIAogICAgICAgICB0ZW1wID0gKHhtbERlZkF0dHJzUHRyKSB4bWxSZWFsbG9jKGRlZmF1bHRzLCBzaXplb2YoeG1sRGVmQXR0cnMpICsKLQkJICAgICAgICgyICogZGVmYXVsdHMtPm1heEF0dHJzICogNCkgKiBzaXplb2YoY29uc3QgeG1sQ2hhciAqKSk7CisJCSAgICAgICAoMiAqIGRlZmF1bHRzLT5tYXhBdHRycyAqIDUpICogc2l6ZW9mKGNvbnN0IHhtbENoYXIgKikpOwogCWlmICh0ZW1wID09IE5VTEwpCiAJICAgIGdvdG8gbWVtX2Vycm9yOwogCWRlZmF1bHRzID0gdGVtcDsKIAlkZWZhdWx0cy0+bWF4QXR0cnMgKj0gMjsKLQl4bWxIYXNoVXBkYXRlRW50cnkyKGN0eHQtPmF0dHNEZWZhdWx0LCBuYW1lLCBwcmVmaXgsIGRlZmF1bHRzLCBOVUxMKTsKKwlpZiAoeG1sSGFzaFVwZGF0ZUVudHJ5MihjdHh0LT5hdHRzRGVmYXVsdCwgbmFtZSwgcHJlZml4LAorCSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzLCBOVUxMKSA8IDApIHsKKwkgICAgeG1sRnJlZShkZWZhdWx0cyk7CisJICAgIGdvdG8gbWVtX2Vycm9yOworCX0KICAgICB9CiAKICAgICAvKgpAQCAtOTM0LDEzICsxMTcyLDE3IEBACiAJcHJlZml4ID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBmdWxsYXR0ciwgbGVuKTsKICAgICB9CiAKLSAgICBkZWZhdWx0cy0+dmFsdWVzWzQgKiBkZWZhdWx0cy0+bmJBdHRyc10gPSBuYW1lOwotICAgIGRlZmF1bHRzLT52YWx1ZXNbNCAqIGRlZmF1bHRzLT5uYkF0dHJzICsgMV0gPSBwcmVmaXg7CisgICAgZGVmYXVsdHMtPnZhbHVlc1s1ICogZGVmYXVsdHMtPm5iQXR0cnNdID0gbmFtZTsKKyAgICBkZWZhdWx0cy0+dmFsdWVzWzUgKiBkZWZhdWx0cy0+bmJBdHRycyArIDFdID0gcHJlZml4OwogICAgIC8qIGludGVybiB0aGUgc3RyaW5nIGFuZCBwcmVjb21wdXRlIHRoZSBlbmQgKi8KICAgICBsZW4gPSB4bWxTdHJsZW4odmFsdWUpOwogICAgIHZhbHVlID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCB2YWx1ZSwgbGVuKTsKLSAgICBkZWZhdWx0cy0+dmFsdWVzWzQgKiBkZWZhdWx0cy0+bmJBdHRycyArIDJdID0gdmFsdWU7Ci0gICAgZGVmYXVsdHMtPnZhbHVlc1s0ICogZGVmYXVsdHMtPm5iQXR0cnMgKyAzXSA9IHZhbHVlICsgbGVuOworICAgIGRlZmF1bHRzLT52YWx1ZXNbNSAqIGRlZmF1bHRzLT5uYkF0dHJzICsgMl0gPSB2YWx1ZTsKKyAgICBkZWZhdWx0cy0+dmFsdWVzWzUgKiBkZWZhdWx0cy0+bmJBdHRycyArIDNdID0gdmFsdWUgKyBsZW47CisgICAgaWYgKGN0eHQtPmV4dGVybmFsKQorICAgICAgICBkZWZhdWx0cy0+dmFsdWVzWzUgKiBkZWZhdWx0cy0+bmJBdHRycyArIDRdID0gQkFEX0NBU1QgImV4dGVybmFsIjsKKyAgICBlbHNlCisgICAgICAgIGRlZmF1bHRzLT52YWx1ZXNbNSAqIGRlZmF1bHRzLT5uYkF0dHJzICsgNF0gPSBOVUxMOwogICAgIGRlZmF1bHRzLT5uYkF0dHJzKys7CiAKICAgICByZXR1cm47CkBAIC0xMDk2LDcgKzEzMzgsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKLSAqIAkJUGFyc2VyIHN0YWNrcyByZWxhdGVkIGZ1bmN0aW9ucyBhbmQgbWFjcm9zCQkqCisgKgkJUGFyc2VyIHN0YWNrcyByZWxhdGVkIGZ1bmN0aW9ucyBhbmQgbWFjcm9zCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTExNDEsMTUgKzEzODMsMTYgQEAKICAgICAgICAgICAgIHJldHVybiAoLTEpOwogCX0KICAgICB9IGVsc2UgaWYgKGN0eHQtPm5zTnIgPj0gY3R4dC0+bnNNYXgpIHsKKyAgICAgICAgY29uc3QgeG1sQ2hhciAqKiB0bXA7CiAgICAgICAgIGN0eHQtPm5zTWF4ICo9IDI7Ci0gICAgICAgIGN0eHQtPm5zVGFiID0gKGNvbnN0IHhtbENoYXIgKiopCi0JICAgICAgICAgICAgICB4bWxSZWFsbG9jKChjaGFyICopIGN0eHQtPm5zVGFiLAotCQkJCSBjdHh0LT5uc01heCAqIHNpemVvZihjdHh0LT5uc1RhYlswXSkpOwotICAgICAgICBpZiAoY3R4dC0+bnNUYWIgPT0gTlVMTCkgeworICAgICAgICB0bXAgPSAoY29uc3QgeG1sQ2hhciAqKikgeG1sUmVhbGxvYygoY2hhciAqKSBjdHh0LT5uc1RhYiwKKwkJCQkgICAgY3R4dC0+bnNNYXggKiBzaXplb2YoY3R4dC0+bnNUYWJbMF0pKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CiAJICAgIGN0eHQtPm5zTWF4IC89IDI7CiAgICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICAgfQorCWN0eHQtPm5zVGFiID0gdG1wOwogICAgIH0KICAgICBjdHh0LT5uc1RhYltjdHh0LT5uc05yKytdID0gcHJlZml4OwogICAgIGN0eHQtPm5zVGFiW2N0eHQtPm5zTnIrK10gPSBVUkw7CkBAIC0xMTc2LDcgKzE0MTksNyBAQAogICAgIH0KICAgICBpZiAoY3R4dC0+bnNOciA8PSAwKQogICAgICAgICByZXR1cm4gKDApOwotICAgIAorCiAgICAgZm9yIChpID0gMDtpIDwgbnI7aSsrKSB7CiAgICAgICAgICBjdHh0LT5uc05yLS07CiAJIGN0eHQtPm5zVGFiW2N0eHQtPm5zTnJdID0gTlVMTDsKQEAgLTEyMjYsMTMgKzE0NjksMTMgQEAKICAqCiAgKiBQdXNoZXMgYSBuZXcgcGFyc2VyIGlucHV0IG9uIHRvcCBvZiB0aGUgaW5wdXQgc3RhY2sKICAqCi0gKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBlcnJvciwgdGhlIGluZGV4IGluIHRoZSBzdGFjayBvdGhlcndpc2UKKyAqIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgdGhlIGluZGV4IGluIHRoZSBzdGFjayBvdGhlcndpc2UKICAqLwogaW50CiBpbnB1dFB1c2goeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxQYXJzZXJJbnB1dFB0ciB2YWx1ZSkKIHsKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHZhbHVlID09IE5VTEwpKQotICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIHJldHVybigtMSk7CiAgICAgaWYgKGN0eHQtPmlucHV0TnIgPj0gY3R4dC0+aW5wdXRNYXgpIHsKICAgICAgICAgY3R4dC0+aW5wdXRNYXggKj0gMjsKICAgICAgICAgY3R4dC0+aW5wdXRUYWIgPQpAQCAtMTI0MSw3ICsxNDg0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3R4dC0+aW5wdXRUYWJbMF0pKTsKICAgICAgICAgaWYgKGN0eHQtPmlucHV0VGFiID09IE5VTEwpIHsKICAgICAgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7CisJICAgIHhtbEZyZWVJbnB1dFN0cmVhbSh2YWx1ZSk7CisJICAgIGN0eHQtPmlucHV0TWF4IC89IDI7CisJICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgICB9CiAgICAgfQogICAgIGN0eHQtPmlucHV0VGFiW2N0eHQtPmlucHV0TnJdID0gdmFsdWU7CkBAIC0xMjgxLDcgKzE1MjcsNyBAQAogICoKICAqIFB1c2hlcyBhIG5ldyBlbGVtZW50IG5vZGUgb24gdG9wIG9mIHRoZSBub2RlIHN0YWNrCiAgKgotICogUmV0dXJucyAwIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBpbmRleCBpbiB0aGUgc3RhY2sgb3RoZXJ3aXNlCisgKiBSZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBpbmRleCBpbiB0aGUgc3RhY2sgb3RoZXJ3aXNlCiAgKi8KIGludAogbm9kZVB1c2goeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxOb2RlUHRyIHZhbHVlKQpAQCAtMTI5NSwyMiArMTU0MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3R4dC0+bm9kZVRhYlswXSkpOwogICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICAgfQogICAgICAgICBjdHh0LT5ub2RlVGFiID0gdG1wOwogCWN0eHQtPm5vZGVNYXggKj0gMjsKICAgICB9Ci0gICAgaWYgKCgodW5zaWduZWQgaW50KSBjdHh0LT5ub2RlTnIpID4geG1sUGFyc2VyTWF4RGVwdGgpIHsKKyAgICBpZiAoKCgodW5zaWduZWQgaW50KSBjdHh0LT5ub2RlTnIpID4geG1sUGFyc2VyTWF4RGVwdGgpICYmCisgICAgICAgICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9IVUdFKSA9PSAwKSkgewogCXhtbEZhdGFsRXJyTXNnSW50KGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCi0JCSAiRXhjZXNzaXZlIGRlcHRoIGluIGRvY3VtZW50OiBjaGFuZ2UgeG1sUGFyc2VyTWF4RGVwdGggPSAlZFxuIiwKKwkJICJFeGNlc3NpdmUgZGVwdGggaW4gZG9jdW1lbnQ6ICVkIHVzZSBYTUxfUEFSU0VfSFVHRSBvcHRpb25cbiIsCiAJCQkgIHhtbFBhcnNlck1heERlcHRoKTsKIAljdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9FT0Y7Ci0JcmV0dXJuKDApOworCXJldHVybigtMSk7CiAgICAgfQogICAgIGN0eHQtPm5vZGVUYWJbY3R4dC0+bm9kZU5yXSA9IHZhbHVlOwogICAgIGN0eHQtPm5vZGUgPSB2YWx1ZTsKICAgICByZXR1cm4gKGN0eHQtPm5vZGVOcisrKTsKIH0KKwogLyoqCiAgKiBub2RlUG9wOgogICogQGN0eHQ6IGFuIFhNTCBwYXJzZXIgY29udGV4dApAQCAtMTQ3MCwxMyArMTcxOCwxNyBAQAogCiBzdGF0aWMgaW50IHNwYWNlUHVzaCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIGludCB2YWwpIHsKICAgICBpZiAoY3R4dC0+c3BhY2VOciA+PSBjdHh0LT5zcGFjZU1heCkgeworICAgICAgICBpbnQgKnRtcDsKKwogCWN0eHQtPnNwYWNlTWF4ICo9IDI7Ci0gICAgICAgIGN0eHQtPnNwYWNlVGFiID0gKGludCAqKSB4bWxSZWFsbG9jKGN0eHQtPnNwYWNlVGFiLAotCSAgICAgICAgICAgICBjdHh0LT5zcGFjZU1heCAqIHNpemVvZihjdHh0LT5zcGFjZVRhYlswXSkpOwotICAgICAgICBpZiAoY3R4dC0+c3BhY2VUYWIgPT0gTlVMTCkgeworICAgICAgICB0bXAgPSAoaW50ICopIHhtbFJlYWxsb2MoY3R4dC0+c3BhY2VUYWIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnNwYWNlTWF4ICogc2l6ZW9mKGN0eHQtPnNwYWNlVGFiWzBdKSk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7Ci0JICAgIHJldHVybigwKTsKKwkgICAgY3R4dC0+c3BhY2VNYXggLz0yOworCSAgICByZXR1cm4oLTEpOwogCX0KKwljdHh0LT5zcGFjZVRhYiA9IHRtcDsKICAgICB9CiAgICAgY3R4dC0+c3BhY2VUYWJbY3R4dC0+c3BhY2VOcl0gPSB2YWw7CiAgICAgY3R4dC0+c3BhY2UgPSAmY3R4dC0+c3BhY2VUYWJbY3R4dC0+c3BhY2VOcl07CkBAIC0xNzIyLDEwICsxOTc0LDEyIEBACiAgKgogICogeG1sUHVzaElucHV0OiBzd2l0Y2ggdG8gYSBuZXcgaW5wdXQgc3RyZWFtIHdoaWNoIGlzIHN0YWNrZWQgb24gdG9wCiAgKiAgICAgICAgICAgICAgIG9mIHRoZSBwcmV2aW91cyBvbmUocykuCisgKiBSZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3Igb3IgdGhlIGluZGV4IGluIHRoZSBpbnB1dCBzdGFjawogICovCi12b2lkCitpbnQKIHhtbFB1c2hJbnB1dCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIHhtbFBhcnNlcklucHV0UHRyIGlucHV0KSB7Ci0gICAgaWYgKGlucHV0ID09IE5VTEwpIHJldHVybjsKKyAgICBpbnQgcmV0OworICAgIGlmIChpbnB1dCA9PSBOVUxMKSByZXR1cm4oLTEpOwogCiAgICAgaWYgKHhtbFBhcnNlckRlYnVnRW50aXRpZXMpIHsKIAlpZiAoKGN0eHQtPmlucHV0ICE9IE5VTEwpICYmIChjdHh0LT5pbnB1dC0+ZmlsZW5hbWUpKQpAQCAtMTczNSw4ICsxOTg5LDkgQEAKIAl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJIlB1c2hpbmcgaW5wdXQgJWQgOiAlLjMwc1xuIiwgY3R4dC0+aW5wdXROcisxLCBpbnB1dC0+Y3VyKTsKICAgICB9Ci0gICAgaW5wdXRQdXNoKGN0eHQsIGlucHV0KTsKKyAgICByZXQgPSBpbnB1dFB1c2goY3R4dCwgaW5wdXQpOwogICAgIEdST1c7CisgICAgcmV0dXJuKHJldCk7CiB9CiAKIC8qKgpAQCAtMTk2Niw2ICsyMjIxLDcgQEAKICAgICBidWZmZXIgPSB4bWxNYWxsb2NBdG9taWMobGVuZ3RoKTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKIAl4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CisgICAgICAgIHhtbEZyZWUoaW5wdXQpOwogICAgIAlyZXR1cm4oTlVMTCk7CiAgICAgfQogICAgIGJ1ZmZlciBbMF0gPSAnICc7CkBAIC0yMTEzLDcgKzIzNjksNyBAQAogCQkgICAgaWYgKChjdHh0LT52YWxpZGF0ZSkgJiYgKGN0eHQtPnZjdHh0LmVycm9yICE9IE5VTEwpKSB7CiAJCSAgICAgICAgeG1sVmFsaWRpdHlFcnJvcihjdHh0LCBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZLAogCQkJICAgICAgICAgICAgICAgICAiUEVSZWZlcmVuY2U6ICUlJXM7IG5vdCBmb3VuZFxuIiwKLQkJCQkgICAgICAgICBuYW1lKTsKKwkJCQkgICAgICAgICBuYW1lLCBOVUxMKTsKIAkJICAgIH0gZWxzZSAKIAkJICAgICAgICB4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFksCiAJCQkgICAgICAgICAgICAgICJQRVJlZmVyZW5jZTogJSUlczsgbm90IGZvdW5kXG4iLApAQCAtMjEyMiw3ICsyMzc4LDggQEAKIAkJfQogCSAgICB9IGVsc2UgaWYgKGN0eHQtPmlucHV0LT5mcmVlICE9IGRlYWxsb2NibGFua3N3cmFwcGVyKSB7CiAJCSAgICBpbnB1dCA9IHhtbE5ld0JsYW5rc1dyYXBwZXJJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOwotCQkgICAgeG1sUHVzaElucHV0KGN0eHQsIGlucHV0KTsKKwkJICAgIGlmICh4bWxQdXNoSW5wdXQoY3R4dCwgaW5wdXQpIDwgMCkKKwkJICAgICAgICByZXR1cm47CiAJICAgIH0gZWxzZSB7CiAJICAgICAgICBpZiAoKGVudGl0eS0+ZXR5cGUgPT0gWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpIHx8CiAJCSAgICAoZW50aXR5LT5ldHlwZSA9PSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkpIHsKQEAgLTIxMzUsNyArMjM5Miw4IEBACiAJCSAgICAgKiB0aGlzIGlzIGRvbmUgaW5kZXBlbmRlbnRseS4KIAkJICAgICAqLwogCQkgICAgaW5wdXQgPSB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOwotCQkgICAgeG1sUHVzaElucHV0KGN0eHQsIGlucHV0KTsKKwkJICAgIGlmICh4bWxQdXNoSW5wdXQoY3R4dCwgaW5wdXQpIDwgMCkKKwkJICAgICAgICByZXR1cm47CiAKIAkJICAgIC8qIAogCQkgICAgICogR2V0IHRoZSA0IGZpcnN0IGJ5dGVzIGFuZCBkZWNvZGUgdGhlIGNoYXJzZXQKQEAgLTIxNzgsMTEgKzI0MzYsMTIgQEAKIC8qCiAgKiBNYWNybyB1c2VkIHRvIGdyb3cgdGhlIGN1cnJlbnQgYnVmZmVyLgogICovCi0jZGVmaW5lIGdyb3dCdWZmZXIoYnVmZmVyKSB7CQkJCQkJXAorI2RlZmluZSBncm93QnVmZmVyKGJ1ZmZlciwgbikgewkJCQkJCVwKICAgICB4bWxDaGFyICp0bXA7CQkJCQkJCVwKICAgICBidWZmZXIjI19zaXplICo9IDI7CQkJCQkJCVwKKyAgICBidWZmZXIjI19zaXplICs9IG47CQkJCQkJCVwKICAgICB0bXAgPSAoeG1sQ2hhciAqKQkJCQkJCQlcCi0gICAgCQl4bWxSZWFsbG9jKGJ1ZmZlciwgYnVmZmVyIyNfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CVwKKwkJeG1sUmVhbGxvYyhidWZmZXIsIGJ1ZmZlciMjX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwlcCiAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIG1lbV9lcnJvcjsJCQkJCVwKICAgICBidWZmZXIgPSB0bXA7CQkJCQkJCVwKIH0KQEAgLTIyMTMsNiArMjQ3Miw3IEBACiAgICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKIAogICAgIHhtbENoYXIgKmN1cnJlbnQgPSBOVUxMOworICAgIHhtbENoYXIgKnJlcCA9IE5VTEw7CiAgICAgY29uc3QgeG1sQ2hhciAqbGFzdDsKICAgICB4bWxFbnRpdHlQdHIgZW50OwogICAgIGludCBjLGw7CkBAIC0yMjIyLDcgKzI0ODIsOSBAQAogCXJldHVybihOVUxMKTsKICAgICBsYXN0ID0gc3RyICsgbGVuOwogCi0gICAgaWYgKGN0eHQtPmRlcHRoID4gNDApIHsKKyAgICBpZiAoKChjdHh0LT5kZXB0aCA+IDQwKSAmJgorICAgICAgICAgKChjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX0hVR0UpID09IDApKSB8fAorCShjdHh0LT5kZXB0aCA+IDEwMjQpKSB7CiAJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlfTE9PUCwgTlVMTCk7CiAJcmV0dXJuKE5VTEwpOwogICAgIH0KQEAgLTIyNTIsNyArMjUxNCw3IEBACiAJCUNPUFlfQlVGKDAsYnVmZmVyLG5iY2hhcnMsdmFsKTsKIAkgICAgfQogCSAgICBpZiAobmJjaGFycyA+IGJ1ZmZlcl9zaXplIC0gWE1MX1BBUlNFUl9CVUZGRVJfU0laRSkgewotCSAgICAgICAgZ3Jvd0J1ZmZlcihidWZmZXIpOworCSAgICAgICAgZ3Jvd0J1ZmZlcihidWZmZXIsIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpOwogCSAgICB9CiAJfSBlbHNlIGlmICgoYyA9PSAnJicpICYmICh3aGF0ICYgWE1MX1NVQlNUSVRVVEVfUkVGKSkgewogCSAgICBpZiAoeG1sUGFyc2VyRGVidWdFbnRpdGllcykKQEAgLTIyNjAsMzQgKzI1MjIsNDEgQEAKIAkJCSJTdHJpbmcgZGVjb2RpbmcgRW50aXR5IFJlZmVyZW5jZTogJS4zMHNcbiIsCiAJCQlzdHIpOwogCSAgICBlbnQgPSB4bWxQYXJzZVN0cmluZ0VudGl0eVJlZihjdHh0LCAmc3RyKTsKKwkgICAgaWYgKChjdHh0LT5sYXN0RXJyb3IuY29kZSA9PSBYTUxfRVJSX0VOVElUWV9MT09QKSB8fAorCSAgICAgICAgKGN0eHQtPmxhc3RFcnJvci5jb2RlID09IFhNTF9FUlJfSU5URVJOQUxfRVJST1IpKQorCSAgICAgICAgZ290byBpbnRfZXJyb3I7CisJICAgIGlmIChlbnQgIT0gTlVMTCkKKwkgICAgICAgIGN0eHQtPm5iZW50aXRpZXMgKz0gZW50LT5jaGVja2VkOwogCSAgICBpZiAoKGVudCAhPSBOVUxMKSAmJgogCQkoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFkpKSB7CiAJCWlmIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkgewogCQkgICAgQ09QWV9CVUYoMCxidWZmZXIsbmJjaGFycyxlbnQtPmNvbnRlbnRbMF0pOwogCQkgICAgaWYgKG5iY2hhcnMgPiBidWZmZXJfc2l6ZSAtIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpIHsKLQkJCWdyb3dCdWZmZXIoYnVmZmVyKTsKKwkJCWdyb3dCdWZmZXIoYnVmZmVyLCBYTUxfUEFSU0VSX0JVRkZFUl9TSVpFKTsKIAkJICAgIH0KIAkJfSBlbHNlIHsKIAkJICAgIHhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCiAJCQkgICAgInByZWRlZmluZWQgZW50aXR5IGhhcyBubyBjb250ZW50XG4iKTsKIAkJfQogCSAgICB9IGVsc2UgaWYgKChlbnQgIT0gTlVMTCkgJiYgKGVudC0+Y29udGVudCAhPSBOVUxMKSkgewotCQl4bWxDaGFyICpyZXA7Ci0KIAkJY3R4dC0+ZGVwdGgrKzsKIAkJcmVwID0geG1sU3RyaW5nRGVjb2RlRW50aXRpZXMoY3R4dCwgZW50LT5jb250ZW50LCB3aGF0LAogCQkJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOwogCQljdHh0LT5kZXB0aC0tOworCiAJCWlmIChyZXAgIT0gTlVMTCkgewogCQkgICAgY3VycmVudCA9IHJlcDsKIAkJICAgIHdoaWxlICgqY3VycmVudCAhPSAwKSB7IC8qIG5vbiBpbnB1dCBjb25zdW1pbmcgbG9vcCAqLwogCQkJYnVmZmVyW25iY2hhcnMrK10gPSAqY3VycmVudCsrOwogCQkJaWYgKG5iY2hhcnMgPgogCQkgICAgICAgICAgICBidWZmZXJfc2l6ZSAtIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpIHsKLQkJCSAgICBncm93QnVmZmVyKGJ1ZmZlcik7CisJCQkgICAgaWYgKHhtbFBhcnNlckVudGl0eUNoZWNrKGN0eHQsIG5iY2hhcnMsIGVudCkpCisJCQkJZ290byBpbnRfZXJyb3I7CisJCQkgICAgZ3Jvd0J1ZmZlcihidWZmZXIsIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpOwogCQkJfQogCQkgICAgfQogCQkgICAgeG1sRnJlZShyZXApOworCQkgICAgcmVwID0gTlVMTDsKIAkJfQogCSAgICB9IGVsc2UgaWYgKGVudCAhPSBOVUxMKSB7CiAJCWludCBpID0geG1sU3RybGVuKGVudC0+bmFtZSk7CkBAIC0yMjk1LDcgKzI1NjQsNyBAQAogCiAJCWJ1ZmZlcltuYmNoYXJzKytdID0gJyYnOwogCQlpZiAobmJjaGFycyA+IGJ1ZmZlcl9zaXplIC0gaSAtIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpIHsKLQkJICAgIGdyb3dCdWZmZXIoYnVmZmVyKTsKKwkJICAgIGdyb3dCdWZmZXIoYnVmZmVyLCBYTUxfUEFSU0VSX0JVRkZFUl9TSVpFKTsKIAkJfQogCQlmb3IgKDtpID4gMDtpLS0pCiAJCSAgICBidWZmZXJbbmJjaGFycysrXSA9ICpjdXIrKzsKQEAgLTIzMDYsOSArMjU3NSwxNCBAQAogCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCSJTdHJpbmcgZGVjb2RpbmcgUEUgUmVmZXJlbmNlOiAlLjMwc1xuIiwgc3RyKTsKIAkgICAgZW50ID0geG1sUGFyc2VTdHJpbmdQRVJlZmVyZW5jZShjdHh0LCAmc3RyKTsKKwkgICAgaWYgKGN0eHQtPmxhc3RFcnJvci5jb2RlID09IFhNTF9FUlJfRU5USVRZX0xPT1ApCisJICAgICAgICBnb3RvIGludF9lcnJvcjsKKwkgICAgaWYgKGVudCAhPSBOVUxMKQorCSAgICAgICAgY3R4dC0+bmJlbnRpdGllcyArPSBlbnQtPmNoZWNrZWQ7CiAJICAgIGlmIChlbnQgIT0gTlVMTCkgewotCQl4bWxDaGFyICpyZXA7Ci0KKyAgICAgICAgICAgICAgICBpZiAoZW50LT5jb250ZW50ID09IE5VTEwpIHsKKwkJICAgIHhtbExvYWRFbnRpdHlDb250ZW50KGN0eHQsIGVudCk7CisJCX0KIAkJY3R4dC0+ZGVwdGgrKzsKIAkJcmVwID0geG1sU3RyaW5nRGVjb2RlRW50aXRpZXMoY3R4dCwgZW50LT5jb250ZW50LCB3aGF0LAogCQkJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOwpAQCAtMjMxOSwxNyArMjU5MywyMCBAQAogCQkJYnVmZmVyW25iY2hhcnMrK10gPSAqY3VycmVudCsrOwogCQkJaWYgKG5iY2hhcnMgPgogCQkgICAgICAgICAgICBidWZmZXJfc2l6ZSAtIFhNTF9QQVJTRVJfQlVGRkVSX1NJWkUpIHsKLQkJCSAgICBncm93QnVmZmVyKGJ1ZmZlcik7CisJCQkgICAgaWYgKHhtbFBhcnNlckVudGl0eUNoZWNrKGN0eHQsIG5iY2hhcnMsIGVudCkpCisJCQkgICAgICAgIGdvdG8gaW50X2Vycm9yOworCQkJICAgIGdyb3dCdWZmZXIoYnVmZmVyLCBYTUxfUEFSU0VSX0JVRkZFUl9TSVpFKTsKIAkJCX0KIAkJICAgIH0KIAkJICAgIHhtbEZyZWUocmVwKTsKKwkJICAgIHJlcCA9IE5VTEw7CiAJCX0KIAkgICAgfQogCX0gZWxzZSB7CiAJICAgIENPUFlfQlVGKGwsYnVmZmVyLG5iY2hhcnMsYyk7CiAJICAgIHN0ciArPSBsOwogCSAgICBpZiAobmJjaGFycyA+IGJ1ZmZlcl9zaXplIC0gWE1MX1BBUlNFUl9CVUZGRVJfU0laRSkgewotCSAgICAgIGdyb3dCdWZmZXIoYnVmZmVyKTsKKwkgICAgICBncm93QnVmZmVyKGJ1ZmZlciwgWE1MX1BBUlNFUl9CVUZGRVJfU0laRSk7CiAJICAgIH0KIAl9CiAJaWYgKHN0ciA8IGxhc3QpCkBAIC0yMzQyLDYgKzI2MTksMTEgQEAKIAogbWVtX2Vycm9yOgogICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKK2ludF9lcnJvcjoKKyAgICBpZiAocmVwICE9IE5VTEwpCisgICAgICAgIHhtbEZyZWUocmVwKTsKKyAgICBpZiAoYnVmZmVyICE9IE5VTEwpCisgICAgICAgIHhtbEZyZWUoYnVmZmVyKTsKICAgICByZXR1cm4oTlVMTCk7CiB9CiAKQEAgLTI0NTYsNyArMjczOCw3IEBACiAgKiB4bWxTcGxpdFFOYW1lOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKICAqIEBuYW1lOiAgYW4gWE1MIHBhcnNlciBjb250ZXh0Ci0gKiBAcHJlZml4OiAgYSB4bWxDaGFyICoqIAorICogQHByZWZpeDogIGEgeG1sQ2hhciAqKgogICoKICAqIHBhcnNlIGFuIFVURjggZW5jb2RlZCBYTUwgcXVhbGlmaWVkIG5hbWUgc3RyaW5nCiAgKgpAQCAtMjUwNyw3ICsyNzg5LDcgQEAKIAkgKiBmb3IgdGhlIHByb2Nlc3Npbmcgc3BlZWQuCiAJICovCiAJbWF4ID0gbGVuICogMjsKLQkKKwogCWJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhtYXggKiBzaXplb2YoeG1sQ2hhcikpOwogCWlmIChidWZmZXIgPT0gTlVMTCkgewogCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CkBAIC0yNTIyLDcgKzI4MDQsNyBAQAogCQl0bXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKGJ1ZmZlciwKIAkJCQkJCW1heCAqIHNpemVvZih4bWxDaGFyKSk7CiAJCWlmICh0bXAgPT0gTlVMTCkgewotCQkgICAgeG1sRnJlZSh0bXApOworCQkgICAgeG1sRnJlZShidWZmZXIpOwogCQkgICAgeG1sRXJyTWVtb3J5KGN0eHQsIE5VTEwpOwogCQkgICAgcmV0dXJuKE5VTEwpOwogCQl9CkBAIC0yNTMzLDcgKzI4MTUsNyBAQAogCX0KIAlidWZmZXJbbGVuXSA9IDA7CiAgICAgfQotICAgIAorCiAgICAgaWYgKChjID09ICc6JykgJiYgKCpjdXIgPT0gMCkpIHsKICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQogCSAgICB4bWxGcmVlKGJ1ZmZlcik7CkBAIC0yNTg2LDcgKzI4NjgsNyBAQAogCSAgICAgKiBmb3IgdGhlIHByb2Nlc3Npbmcgc3BlZWQuCiAJICAgICAqLwogCSAgICBtYXggPSBsZW4gKiAyOwotCSAgICAKKwogCSAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2NBdG9taWMobWF4ICogc2l6ZW9mKHhtbENoYXIpKTsKIAkgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CkBAIC0yNjEyLDcgKzI4OTQsNyBAQAogCSAgICB9CiAJICAgIGJ1ZmZlcltsZW5dID0gMDsKIAl9Ci0JCisKIAlpZiAoYnVmZmVyID09IE5VTEwpCiAJICAgIHJldCA9IHhtbFN0cm5kdXAoYnVmLCBsZW4pOwogCWVsc2UgewpAQCAtMjYzMCwxMCArMjkxMiwxOTggQEAKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IHhtbENoYXIgKiB4bWxQYXJzZU5hbWVDb21wbGV4KHhtbFBhcnNlckN0eHRQdHIgY3R4dCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCSoKKyAqCVJvdXRpbmVzIHRvIHBhcnNlIE5hbWUsIE5DTmFtZSBhbmQgTm1Ub2tlbgkJCSoKKyAqCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgbmJQYXJzZU5hbWUgPSAwOwordW5zaWduZWQgbG9uZyBuYlBhcnNlTm1Ub2tlbiA9IDA7Cit1bnNpZ25lZCBsb25nIG5iUGFyc2VOQ05hbWUgPSAwOwordW5zaWduZWQgbG9uZyBuYlBhcnNlTkNOYW1lQ29tcGxleCA9IDA7Cit1bnNpZ25lZCBsb25nIG5iUGFyc2VOYW1lQ29tcGxleCA9IDA7Cit1bnNpZ25lZCBsb25nIG5iUGFyc2VTdHJpbmdOYW1lID0gMDsKKy8qCisgKiBUaGUgdHdvIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHJlbGF0ZWQgdG8gdGhlIGNoYW5nZSBvZiBhY2NlcHRlZAorICogY2hhcmFjdGVycyBmb3IgTmFtZSBhbmQgTm1Ub2tlbiBpbiB0aGUgUmV2aXNpb24gNSBvZiBYTUwtMS4wCisgKiBUaGV5IGNvcnJlc3BvbmQgdG8gdGhlIG1vZGlmaWVkIHByb2R1Y3Rpb24gWzRdIGFuZCB0aGUgbmV3IHByb2R1Y3Rpb24gWzRhXQorICogY2hhbmdlcyBpbiB0aGF0IHJldmlzaW9uLiBBbHNvIG5vdGUgdGhhdCB0aGUgbWFjcm9zIHVzZWQgZm9yIHRoZQorICogcHJvZHVjdGlvbnMgTGV0dGVyLCBEaWdpdCwgQ29tYmluaW5nQ2hhciBhbmQgRXh0ZW5kZXIgYXJlIG5vdCBuZWVkZWQKKyAqIGFueW1vcmUuCisgKiBXZSBzdGlsbCBrZWVwIGNvbXBhdGliaWxpdHkgdG8gcHJlLXJldmlzaW9uNSBwYXJzaW5nIHNlbWFudGljIGlmIHRoZQorICogbmV3IFhNTF9QQVJTRV9PTEQxMCBvcHRpb24gaXMgZ2l2ZW4gdG8gdGhlIHBhcnNlci4KKyAqLworc3RhdGljIGludAoreG1sSXNOYW1lU3RhcnRDaGFyKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgaW50IGMpIHsKKyAgICBpZiAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfT0xEMTApID09IDApIHsKKyAgICAgICAgLyoKKwkgKiBVc2UgdGhlIG5ldyBjaGVja3Mgb2YgcHJvZHVjdGlvbiBbNF0gWzRhXSBhbWQgWzVdIG9mIHRoZQorCSAqIFVwZGF0ZSA1IG9mIFhNTC0xLjAKKwkgKi8KKwlpZiAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnPicpICYmIChjICE9ICcvJykgJiYgLyogYWNjZWxlcmF0b3JzICovCisJICAgICgoKGMgPj0gJ2EnKSAmJiAoYyA8PSAneicpKSB8fAorCSAgICAgKChjID49ICdBJykgJiYgKGMgPD0gJ1onKSkgfHwKKwkgICAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fAorCSAgICAgKChjID49IDB4QzApICYmIChjIDw9IDB4RDYpKSB8fAorCSAgICAgKChjID49IDB4RDgpICYmIChjIDw9IDB4RjYpKSB8fAorCSAgICAgKChjID49IDB4RjgpICYmIChjIDw9IDB4MkZGKSkgfHwKKwkgICAgICgoYyA+PSAweDM3MCkgJiYgKGMgPD0gMHgzN0QpKSB8fAorCSAgICAgKChjID49IDB4MzdGKSAmJiAoYyA8PSAweDFGRkYpKSB8fAorCSAgICAgKChjID49IDB4MjAwQykgJiYgKGMgPD0gMHgyMDBEKSkgfHwKKwkgICAgICgoYyA+PSAweDIwNzApICYmIChjIDw9IDB4MjE4RikpIHx8CisJICAgICAoKGMgPj0gMHgyQzAwKSAmJiAoYyA8PSAweDJGRUYpKSB8fAorCSAgICAgKChjID49IDB4MzAwMSkgJiYgKGMgPD0gMHhEN0ZGKSkgfHwKKwkgICAgICgoYyA+PSAweEY5MDApICYmIChjIDw9IDB4RkRDRikpIHx8CisJICAgICAoKGMgPj0gMHhGREYwKSAmJiAoYyA8PSAweEZGRkQpKSB8fAorCSAgICAgKChjID49IDB4MTAwMDApICYmIChjIDw9IDB4RUZGRkYpKSkpCisJICAgIHJldHVybigxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoSVNfTEVUVEVSKGMpIHx8IChjID09ICdfJykgfHwgKGMgPT0gJzonKSkKKwkgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK3htbElzTmFtZUNoYXIoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBpbnQgYykgeworICAgIGlmICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9PTEQxMCkgPT0gMCkgeworICAgICAgICAvKgorCSAqIFVzZSB0aGUgbmV3IGNoZWNrcyBvZiBwcm9kdWN0aW9uIFs0XSBbNGFdIGFtZCBbNV0gb2YgdGhlCisJICogVXBkYXRlIDUgb2YgWE1MLTEuMAorCSAqLworCWlmICgoYyAhPSAnICcpICYmIChjICE9ICc+JykgJiYgKGMgIT0gJy8nKSAmJiAvKiBhY2NlbGVyYXRvcnMgKi8KKwkgICAgKCgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8CisJICAgICAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fAorCSAgICAgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgfHwgLyogIXN0YXJ0ICovCisJICAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwKKwkgICAgIChjID09ICctJykgfHwgKGMgPT0gJy4nKSB8fCAoYyA9PSAweEI3KSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgICgoYyA+PSAweEMwKSAmJiAoYyA8PSAweEQ2KSkgfHwKKwkgICAgICgoYyA+PSAweEQ4KSAmJiAoYyA8PSAweEY2KSkgfHwKKwkgICAgICgoYyA+PSAweEY4KSAmJiAoYyA8PSAweDJGRikpIHx8CisJICAgICAoKGMgPj0gMHgzMDApICYmIChjIDw9IDB4MzZGKSkgfHwgLyogIXN0YXJ0ICovCisJICAgICAoKGMgPj0gMHgzNzApICYmIChjIDw9IDB4MzdEKSkgfHwKKwkgICAgICgoYyA+PSAweDM3RikgJiYgKGMgPD0gMHgxRkZGKSkgfHwKKwkgICAgICgoYyA+PSAweDIwMEMpICYmIChjIDw9IDB4MjAwRCkpIHx8CisJICAgICAoKGMgPj0gMHgyMDNGKSAmJiAoYyA8PSAweDIwNDApKSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgICgoYyA+PSAweDIwNzApICYmIChjIDw9IDB4MjE4RikpIHx8CisJICAgICAoKGMgPj0gMHgyQzAwKSAmJiAoYyA8PSAweDJGRUYpKSB8fAorCSAgICAgKChjID49IDB4MzAwMSkgJiYgKGMgPD0gMHhEN0ZGKSkgfHwKKwkgICAgICgoYyA+PSAweEY5MDApICYmIChjIDw9IDB4RkRDRikpIHx8CisJICAgICAoKGMgPj0gMHhGREYwKSAmJiAoYyA8PSAweEZGRkQpKSB8fAorCSAgICAgKChjID49IDB4MTAwMDApICYmIChjIDw9IDB4RUZGRkYpKSkpCisJICAgICByZXR1cm4oMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwKKyAgICAgICAgICAgIChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fAorCSAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwgCisJICAgIChJU19DT01CSU5JTkcoYykpIHx8CisJICAgIChJU19FWFRFTkRFUihjKSkpCisJICAgIHJldHVybigxKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCiBzdGF0aWMgeG1sQ2hhciAqIHhtbFBhcnNlQXR0VmFsdWVJbnRlcm5hbCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlbiwgaW50ICphbGxvYywgaW50IG5vcm1hbGl6ZSk7CiAKK3N0YXRpYyBjb25zdCB4bWxDaGFyICoKK3htbFBhcnNlTmFtZUNvbXBsZXgoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CisgICAgaW50IGxlbiA9IDAsIGw7CisgICAgaW50IGM7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIG5iUGFyc2VOYW1lQ29tcGxleCsrOworCisgICAgLyoKKyAgICAgKiBIYW5kbGVyIGZvciBtb3JlIGNvbXBsZXggY2FzZXMKKyAgICAgKi8KKyAgICBHUk9XOworICAgIGMgPSBDVVJfQ0hBUihsKTsKKyAgICBpZiAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfT0xEMTApID09IDApIHsKKyAgICAgICAgLyoKKwkgKiBVc2UgdGhlIG5ldyBjaGVja3Mgb2YgcHJvZHVjdGlvbiBbNF0gWzRhXSBhbWQgWzVdIG9mIHRoZQorCSAqIFVwZGF0ZSA1IG9mIFhNTC0xLjAKKwkgKi8KKwlpZiAoKGMgPT0gJyAnKSB8fCAoYyA9PSAnPicpIHx8IChjID09ICcvJykgfHwgLyogYWNjZWxlcmF0b3JzICovCisJICAgICghKCgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8CisJICAgICAgICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHx8CisJICAgICAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fAorCSAgICAgICAoKGMgPj0gMHhDMCkgJiYgKGMgPD0gMHhENikpIHx8CisJICAgICAgICgoYyA+PSAweEQ4KSAmJiAoYyA8PSAweEY2KSkgfHwKKwkgICAgICAgKChjID49IDB4RjgpICYmIChjIDw9IDB4MkZGKSkgfHwKKwkgICAgICAgKChjID49IDB4MzcwKSAmJiAoYyA8PSAweDM3RCkpIHx8CisJICAgICAgICgoYyA+PSAweDM3RikgJiYgKGMgPD0gMHgxRkZGKSkgfHwKKwkgICAgICAgKChjID49IDB4MjAwQykgJiYgKGMgPD0gMHgyMDBEKSkgfHwKKwkgICAgICAgKChjID49IDB4MjA3MCkgJiYgKGMgPD0gMHgyMThGKSkgfHwKKwkgICAgICAgKChjID49IDB4MkMwMCkgJiYgKGMgPD0gMHgyRkVGKSkgfHwKKwkgICAgICAgKChjID49IDB4MzAwMSkgJiYgKGMgPD0gMHhEN0ZGKSkgfHwKKwkgICAgICAgKChjID49IDB4RjkwMCkgJiYgKGMgPD0gMHhGRENGKSkgfHwKKwkgICAgICAgKChjID49IDB4RkRGMCkgJiYgKGMgPD0gMHhGRkZEKSkgfHwKKwkgICAgICAgKChjID49IDB4MTAwMDApICYmIChjIDw9IDB4RUZGRkYpKSkpKSB7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisJbGVuICs9IGw7CisJTkVYVEwobCk7CisJYyA9IENVUl9DSEFSKGwpOworCXdoaWxlICgoYyAhPSAnICcpICYmIChjICE9ICc+JykgJiYgKGMgIT0gJy8nKSAmJiAvKiBhY2NlbGVyYXRvcnMgKi8KKwkgICAgICAgKCgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8CisJICAgICAgICAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fAorCSAgICAgICAgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgfHwgLyogIXN0YXJ0ICovCisJICAgICAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwKKwkgICAgICAgIChjID09ICctJykgfHwgKGMgPT0gJy4nKSB8fCAoYyA9PSAweEI3KSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgICAgICgoYyA+PSAweEMwKSAmJiAoYyA8PSAweEQ2KSkgfHwKKwkgICAgICAgICgoYyA+PSAweEQ4KSAmJiAoYyA8PSAweEY2KSkgfHwKKwkgICAgICAgICgoYyA+PSAweEY4KSAmJiAoYyA8PSAweDJGRikpIHx8CisJICAgICAgICAoKGMgPj0gMHgzMDApICYmIChjIDw9IDB4MzZGKSkgfHwgLyogIXN0YXJ0ICovCisJICAgICAgICAoKGMgPj0gMHgzNzApICYmIChjIDw9IDB4MzdEKSkgfHwKKwkgICAgICAgICgoYyA+PSAweDM3RikgJiYgKGMgPD0gMHgxRkZGKSkgfHwKKwkgICAgICAgICgoYyA+PSAweDIwMEMpICYmIChjIDw9IDB4MjAwRCkpIHx8CisJICAgICAgICAoKGMgPj0gMHgyMDNGKSAmJiAoYyA8PSAweDIwNDApKSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgICAgICgoYyA+PSAweDIwNzApICYmIChjIDw9IDB4MjE4RikpIHx8CisJICAgICAgICAoKGMgPj0gMHgyQzAwKSAmJiAoYyA8PSAweDJGRUYpKSB8fAorCSAgICAgICAgKChjID49IDB4MzAwMSkgJiYgKGMgPD0gMHhEN0ZGKSkgfHwKKwkgICAgICAgICgoYyA+PSAweEY5MDApICYmIChjIDw9IDB4RkRDRikpIHx8CisJICAgICAgICAoKGMgPj0gMHhGREYwKSAmJiAoYyA8PSAweEZGRkQpKSB8fAorCSAgICAgICAgKChjID49IDB4MTAwMDApICYmIChjIDw9IDB4RUZGRkYpKQorCQkpKSB7CisJICAgIGlmIChjb3VudCsrID4gMTAwKSB7CisJCWNvdW50ID0gMDsKKwkJR1JPVzsKKwkgICAgfQorCSAgICBsZW4gKz0gbDsKKwkgICAgTkVYVEwobCk7CisJICAgIGMgPSBDVVJfQ0hBUihsKTsKKwl9CisgICAgfSBlbHNlIHsKKwlpZiAoKGMgPT0gJyAnKSB8fCAoYyA9PSAnPicpIHx8IChjID09ICcvJykgfHwgLyogYWNjZWxlcmF0b3JzICovCisJICAgICghSVNfTEVUVEVSKGMpICYmIChjICE9ICdfJykgJiYKKwkgICAgIChjICE9ICc6JykpKSB7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisJbGVuICs9IGw7CisJTkVYVEwobCk7CisJYyA9IENVUl9DSEFSKGwpOworCisJd2hpbGUgKChjICE9ICcgJykgJiYgKGMgIT0gJz4nKSAmJiAoYyAhPSAnLycpICYmIC8qIHRlc3QgYmlnbmFtZS54bWwgKi8KKwkgICAgICAgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwKKwkJKGMgPT0gJy4nKSB8fCAoYyA9PSAnLScpIHx8CisJCShjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fCAKKwkJKElTX0NPTUJJTklORyhjKSkgfHwKKwkJKElTX0VYVEVOREVSKGMpKSkpIHsKKwkgICAgaWYgKGNvdW50KysgPiAxMDApIHsKKwkJY291bnQgPSAwOworCQlHUk9XOworCSAgICB9CisJICAgIGxlbiArPSBsOworCSAgICBORVhUTChsKTsKKwkgICAgYyA9IENVUl9DSEFSKGwpOworCX0KKyAgICB9CisgICAgaWYgKCgqY3R4dC0+aW5wdXQtPmN1ciA9PSAnXG4nKSAmJiAoY3R4dC0+aW5wdXQtPmN1clstMV0gPT0gJ1xyJykpCisgICAgICAgIHJldHVybih4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIgLSAobGVuICsgMSksIGxlbikpOworICAgIHJldHVybih4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIgLSBsZW4sIGxlbikpOworfQorCiAvKioKICAqIHhtbFBhcnNlTmFtZToKICAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CkBAIC0yNjU4LDYgKzMxMjgsOCBAQAogCiAgICAgR1JPVzsKIAorICAgIG5iUGFyc2VOYW1lKys7CisKICAgICAvKgogICAgICAqIEFjY2VsZXJhdG9yIGZvciBzaW1wbGUgQVNDSUkgbmFtZXMKICAgICAgKi8KQEAgLTI2ODMsOSArMzE1NSw5MyBAQAogCSAgICByZXR1cm4ocmV0KTsKIAl9CiAgICAgfQorICAgIC8qIGFjY2VsZXJhdG9yIGZvciBzcGVjaWFsIGNhc2VzICovCiAgICAgcmV0dXJuKHhtbFBhcnNlTmFtZUNvbXBsZXgoY3R4dCkpOwogfQogCitzdGF0aWMgY29uc3QgeG1sQ2hhciAqCit4bWxQYXJzZU5DTmFtZUNvbXBsZXgoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CisgICAgaW50IGxlbiA9IDAsIGw7CisgICAgaW50IGM7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIG5iUGFyc2VOQ05hbWVDb21wbGV4Kys7CisKKyAgICAvKgorICAgICAqIEhhbmRsZXIgZm9yIG1vcmUgY29tcGxleCBjYXNlcworICAgICAqLworICAgIEdST1c7CisgICAgYyA9IENVUl9DSEFSKGwpOworICAgIGlmICgoYyA9PSAnICcpIHx8IChjID09ICc+JykgfHwgKGMgPT0gJy8nKSB8fCAvKiBhY2NlbGVyYXRvcnMgKi8KKwkoIXhtbElzTmFtZVN0YXJ0Q2hhcihjdHh0LCBjKSB8fCAoYyA9PSAnOicpKSkgeworCXJldHVybihOVUxMKTsKKyAgICB9CisKKyAgICB3aGlsZSAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnPicpICYmIChjICE9ICcvJykgJiYgLyogdGVzdCBiaWduYW1lLnhtbCAqLworCSAgICh4bWxJc05hbWVDaGFyKGN0eHQsIGMpICYmIChjICE9ICc6JykpKSB7CisJaWYgKGNvdW50KysgPiAxMDApIHsKKwkgICAgY291bnQgPSAwOworCSAgICBHUk9XOworCX0KKwlsZW4gKz0gbDsKKwlORVhUTChsKTsKKwljID0gQ1VSX0NIQVIobCk7CisgICAgfQorICAgIHJldHVybih4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIgLSBsZW4sIGxlbikpOworfQorCisvKioKKyAqIHhtbFBhcnNlTkNOYW1lOgorICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKKyAqIEBsZW46ICBsZW5naHQgb2YgdGhlIHN0cmluZyBwYXJzZWQKKyAqCisgKiBwYXJzZSBhbiBYTUwgbmFtZS4KKyAqCisgKiBbNE5TXSBOQ05hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8CisgKiAgICAgICAgICAgICAgICAgICAgICBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKKyAqCisgKiBbNU5TXSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKKyAqCisgKiBSZXR1cm5zIHRoZSBOYW1lIHBhcnNlZCBvciBOVUxMCisgKi8KKworc3RhdGljIGNvbnN0IHhtbENoYXIgKgoreG1sUGFyc2VOQ05hbWUoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CisgICAgY29uc3QgeG1sQ2hhciAqaW47CisgICAgY29uc3QgeG1sQ2hhciAqcmV0OworICAgIGludCBjb3VudCA9IDA7CisKKyAgICBuYlBhcnNlTkNOYW1lKys7CisKKyAgICAvKgorICAgICAqIEFjY2VsZXJhdG9yIGZvciBzaW1wbGUgQVNDSUkgbmFtZXMKKyAgICAgKi8KKyAgICBpbiA9IGN0eHQtPmlucHV0LT5jdXI7CisgICAgaWYgKCgoKmluID49IDB4NjEpICYmICgqaW4gPD0gMHg3QSkpIHx8CisJKCgqaW4gPj0gMHg0MSkgJiYgKCppbiA8PSAweDVBKSkgfHwKKwkoKmluID09ICdfJykpIHsKKwlpbisrOworCXdoaWxlICgoKCppbiA+PSAweDYxKSAmJiAoKmluIDw9IDB4N0EpKSB8fAorCSAgICAgICAoKCppbiA+PSAweDQxKSAmJiAoKmluIDw9IDB4NUEpKSB8fAorCSAgICAgICAoKCppbiA+PSAweDMwKSAmJiAoKmluIDw9IDB4MzkpKSB8fAorCSAgICAgICAoKmluID09ICdfJykgfHwgKCppbiA9PSAnLScpIHx8CisJICAgICAgICgqaW4gPT0gJy4nKSkKKwkgICAgaW4rKzsKKwlpZiAoKCppbiA+IDApICYmICgqaW4gPCAweDgwKSkgeworCSAgICBjb3VudCA9IGluIC0gY3R4dC0+aW5wdXQtPmN1cjsKKwkgICAgcmV0ID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBjdHh0LT5pbnB1dC0+Y3VyLCBjb3VudCk7CisJICAgIGN0eHQtPmlucHV0LT5jdXIgPSBpbjsKKwkgICAgY3R4dC0+bmJDaGFycyArPSBjb3VudDsKKwkgICAgY3R4dC0+aW5wdXQtPmNvbCArPSBjb3VudDsKKwkgICAgaWYgKHJldCA9PSBOVUxMKSB7CisJICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CisJICAgIH0KKwkgICAgcmV0dXJuKHJldCk7CisJfQorICAgIH0KKyAgICByZXR1cm4oeG1sUGFyc2VOQ05hbWVDb21wbGV4KGN0eHQpKTsKK30KKwogLyoqCiAgKiB4bWxQYXJzZU5hbWVBbmRDb21wYXJlOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKQEAgLTI3MDQsMTUgKzMyNjAsMTUgQEAKICAgICBjb25zdCB4bWxDaGFyICpyZXQ7CiAKICAgICBHUk9XOwotICAgIAorCiAgICAgaW4gPSBjdHh0LT5pbnB1dC0+Y3VyOwogICAgIHdoaWxlICgqaW4gIT0gMCAmJiAqaW4gPT0gKmNtcCkgewotICAgIAkrK2luOworCSsraW47CiAJKytjbXA7CiAJY3R4dC0+aW5wdXQtPmNvbCsrOwogICAgIH0KICAgICBpZiAoKmNtcCA9PSAwICYmICgqaW4gPT0gJz4nIHx8IElTX0JMQU5LX0NIICgqaW4pKSkgewotICAgIAkvKiBzdWNjZXNzICovCisJLyogc3VjY2VzcyAqLwogCWN0eHQtPmlucHV0LT5jdXIgPSBpbjsKIAlyZXR1cm4gKGNvbnN0IHhtbENoYXIqKSAxOwogICAgIH0KQEAgLTI3MjUsNDIgKzMyODEsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCB4bWxDaGFyICoKLXhtbFBhcnNlTmFtZUNvbXBsZXgoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7Ci0gICAgaW50IGxlbiA9IDAsIGw7Ci0gICAgaW50IGM7Ci0gICAgaW50IGNvdW50ID0gMDsKLQotICAgIC8qCi0gICAgICogSGFuZGxlciBmb3IgbW9yZSBjb21wbGV4IGNhc2VzCi0gICAgICovCi0gICAgR1JPVzsKLSAgICBjID0gQ1VSX0NIQVIobCk7Ci0gICAgaWYgKChjID09ICcgJykgfHwgKGMgPT0gJz4nKSB8fCAoYyA9PSAnLycpIHx8IC8qIGFjY2VsZXJhdG9ycyAqLwotCSghSVNfTEVUVEVSKGMpICYmIChjICE9ICdfJykgJiYKLSAgICAgICAgIChjICE9ICc6JykpKSB7Ci0JcmV0dXJuKE5VTEwpOwotICAgIH0KLQotICAgIHdoaWxlICgoYyAhPSAnICcpICYmIChjICE9ICc+JykgJiYgKGMgIT0gJy8nKSAmJiAvKiB0ZXN0IGJpZ25hbWUueG1sICovCi0JICAgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwKLSAgICAgICAgICAgIChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fAotCSAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwgCi0JICAgIChJU19DT01CSU5JTkcoYykpIHx8Ci0JICAgIChJU19FWFRFTkRFUihjKSkpKSB7Ci0JaWYgKGNvdW50KysgPiAxMDApIHsKLQkgICAgY291bnQgPSAwOwotCSAgICBHUk9XOwotCX0KLQlsZW4gKz0gbDsKLQlORVhUTChsKTsKLQljID0gQ1VSX0NIQVIobCk7Ci0gICAgfQotICAgIGlmICgoKmN0eHQtPmlucHV0LT5jdXIgPT0gJ1xuJykgJiYgKGN0eHQtPmlucHV0LT5jdXJbLTFdID09ICdccicpKQotICAgICAgICByZXR1cm4oeG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBjdHh0LT5pbnB1dC0+Y3VyIC0gKGxlbiArIDEpLCBsZW4pKTsKLSAgICByZXR1cm4oeG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBjdHh0LT5pbnB1dC0+Y3VyIC0gbGVuLCBsZW4pKTsKLX0KLQogLyoqCiAgKiB4bWxQYXJzZVN0cmluZ05hbWU6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dApAQCAtMjc4NiwxNyArMzMwNiwxNyBAQAogICAgIGludCBsZW4gPSAwLCBsOwogICAgIGludCBjOwogCisgICAgbmJQYXJzZVN0cmluZ05hbWUrKzsKKwogICAgIGMgPSBDVVJfU0NIQVIoY3VyLCBsKTsKLSAgICBpZiAoIUlTX0xFVFRFUihjKSAmJiAoYyAhPSAnXycpICYmCi0gICAgICAgIChjICE9ICc6JykpIHsKKyAgICBpZiAoIXhtbElzTmFtZVN0YXJ0Q2hhcihjdHh0LCBjKSkgewogCXJldHVybihOVUxMKTsKICAgICB9CiAKLSAgICB3aGlsZSAoKElTX0xFVFRFUihjKSkgfHwgKElTX0RJR0lUKGMpKSB8fCAvKiB0ZXN0IGJpZ2VudG5hbWUueG1sICovCi0gICAgICAgICAgIChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fAotCSAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fCAKLQkgICAoSVNfQ09NQklOSU5HKGMpKSB8fAotCSAgIChJU19FWFRFTkRFUihjKSkpIHsKKyAgICBDT1BZX0JVRihsLGJ1ZixsZW4sYyk7CisgICAgY3VyICs9IGw7CisgICAgYyA9IENVUl9TQ0hBUihjdXIsIGwpOworICAgIHdoaWxlICh4bWxJc05hbWVDaGFyKGN0eHQsIGMpKSB7CiAJQ09QWV9CVUYobCxidWYsbGVuLGMpOwogCWN1ciArPSBsOwogCWMgPSBDVVJfU0NIQVIoY3VyLCBsKTsKQEAgLTI4MDcsMTkgKzMzMjcsMTQgQEAKIAkgICAgICovCiAJICAgIHhtbENoYXIgKmJ1ZmZlcjsKIAkgICAgaW50IG1heCA9IGxlbiAqIDI7Ci0JICAgIAorCiAJICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhtYXggKiBzaXplb2YoeG1sQ2hhcikpOwogCSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKIAkJcmV0dXJuKE5VTEwpOwogCSAgICB9CiAJICAgIG1lbWNweShidWZmZXIsIGJ1ZiwgbGVuKTsKLQkgICAgd2hpbGUgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwKLQkgICAgICAgICAgICAgLyogdGVzdCBiaWdlbnRuYW1lLnhtbCAqLwotCQkgICAoYyA9PSAnLicpIHx8IChjID09ICctJykgfHwKLQkJICAgKGMgPT0gJ18nKSB8fCAoYyA9PSAnOicpIHx8IAotCQkgICAoSVNfQ09NQklOSU5HKGMpKSB8fAotCQkgICAoSVNfRVhURU5ERVIoYykpKSB7CisJICAgIHdoaWxlICh4bWxJc05hbWVDaGFyKGN0eHQsIGMpKSB7CiAJCWlmIChsZW4gKyAxMCA+IG1heCkgewogCQkgICAgeG1sQ2hhciAqdG1wOwogCQkgICAgbWF4ICo9IDI7CkBAIC0yODQ4LDcgKzMzNjMsNyBAQAogLyoqCiAgKiB4bWxQYXJzZU5tdG9rZW46CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAotICogCisgKgogICogcGFyc2UgYW4gWE1MIE5tdG9rZW4uCiAgKgogICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCkBAIC0yODY1LDE0ICszMzgwLDEyIEBACiAgICAgaW50IGM7CiAgICAgaW50IGNvdW50ID0gMDsKIAorICAgIG5iUGFyc2VObVRva2VuKys7CisKICAgICBHUk9XOwogICAgIGMgPSBDVVJfQ0hBUihsKTsKIAotICAgIHdoaWxlICgoSVNfTEVUVEVSKGMpKSB8fCAoSVNfRElHSVQoYykpIHx8IC8qIHRlc3QgYmlndG9rZW4ueG1sICovCi0gICAgICAgICAgIChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fAotCSAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fCAKLQkgICAoSVNfQ09NQklOSU5HKGMpKSB8fAotCSAgIChJU19FWFRFTkRFUihjKSkpIHsKKyAgICB3aGlsZSAoeG1sSXNOYW1lQ2hhcihjdHh0LCBjKSkgewogCWlmIChjb3VudCsrID4gMTAwKSB7CiAJICAgIGNvdW50ID0gMDsKIAkgICAgR1JPVzsKQEAgLTI4ODcsMTggKzM0MDAsMTQgQEAKIAkgICAgICovCiAJICAgIHhtbENoYXIgKmJ1ZmZlcjsKIAkgICAgaW50IG1heCA9IGxlbiAqIDI7Ci0JICAgIAorCiAJICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhtYXggKiBzaXplb2YoeG1sQ2hhcikpOwogCSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKIAkJcmV0dXJuKE5VTEwpOwogCSAgICB9CiAJICAgIG1lbWNweShidWZmZXIsIGJ1ZiwgbGVuKTsKLQkgICAgd2hpbGUgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwgLyogdGVzdCBiaWd0b2tlbi54bWwgKi8KLQkJICAgKGMgPT0gJy4nKSB8fCAoYyA9PSAnLScpIHx8Ci0JCSAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fCAKLQkJICAgKElTX0NPTUJJTklORyhjKSkgfHwKLQkJICAgKElTX0VYVEVOREVSKGMpKSkgeworCSAgICB3aGlsZSAoeG1sSXNOYW1lQ2hhcihjdHh0LCBjKSkgewogCQlpZiAoY291bnQrKyA+IDEwMCkgewogCQkgICAgY291bnQgPSAwOwogCQkgICAgR1JPVzsKQEAgLTMwODUsNiArMzU5NCw3IEBACiB4bWxQYXJzZUF0dFZhbHVlQ29tcGxleCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIGludCAqYXR0bGVuLCBpbnQgbm9ybWFsaXplKSB7CiAgICAgeG1sQ2hhciBsaW1pdCA9IDA7CiAgICAgeG1sQ2hhciAqYnVmID0gTlVMTDsKKyAgICB4bWxDaGFyICpyZXAgPSBOVUxMOwogICAgIGludCBsZW4gPSAwOwogICAgIGludCBidWZfc2l6ZSA9IDA7CiAgICAgaW50IGMsIGwsIGluX3NwYWNlID0gMDsKQEAgLTMxMDMsNyArMzYxMyw3IEBACiAJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9BVFRSSUJVVEVfTk9UX1NUQVJURUQsIE5VTEwpOwogCXJldHVybihOVUxMKTsKICAgICB9Ci0gICAgCisKICAgICAvKgogICAgICAqIGFsbG9jYXRlIGEgdHJhbnNsYXRpb24gYnVmZmVyLgogICAgICAqLwpAQCAtMzEyNiw3ICszNjM2LDcgQEAKIAkJaWYgKHZhbCA9PSAnJicpIHsKIAkJICAgIGlmIChjdHh0LT5yZXBsYWNlRW50aXRpZXMpIHsKIAkJCWlmIChsZW4gPiBidWZfc2l6ZSAtIDEwKSB7Ci0JCQkgICAgZ3Jvd0J1ZmZlcihidWYpOworCQkJICAgIGdyb3dCdWZmZXIoYnVmLCAxMCk7CiAJCQl9CiAJCQlidWZbbGVuKytdID0gJyYnOwogCQkgICAgfSBlbHNlIHsKQEAgLTMxMzUsNyArMzY0NSw3IEBACiAJCQkgKiBjYWxsZWQgYnkgdGhlIGF0dHJpYnV0ZSgpIGZ1bmN0aW9uIGluIFNBWC5jCiAJCQkgKi8KIAkJCWlmIChsZW4gPiBidWZfc2l6ZSAtIDEwKSB7Ci0JCQkgICAgZ3Jvd0J1ZmZlcihidWYpOworCQkJICAgIGdyb3dCdWZmZXIoYnVmLCAxMCk7CiAJCQl9CiAJCQlidWZbbGVuKytdID0gJyYnOwogCQkJYnVmW2xlbisrXSA9ICcjJzsKQEAgLTMxNDMsMTggKzM2NTMsMjEgQEAKIAkJCWJ1ZltsZW4rK10gPSAnOCc7CiAJCQlidWZbbGVuKytdID0gJzsnOwogCQkgICAgfQotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHZhbCAhPSAwKSB7CiAJCSAgICBpZiAobGVuID4gYnVmX3NpemUgLSAxMCkgewotCQkJZ3Jvd0J1ZmZlcihidWYpOworCQkJZ3Jvd0J1ZmZlcihidWYsIDEwKTsKIAkJICAgIH0KIAkJICAgIGxlbiArPSB4bWxDb3B5Q2hhcigwLCAmYnVmW2xlbl0sIHZhbCk7CiAJCX0KIAkgICAgfSBlbHNlIHsKIAkJZW50ID0geG1sUGFyc2VFbnRpdHlSZWYoY3R4dCk7CisJCWN0eHQtPm5iZW50aXRpZXMrKzsKKwkJaWYgKGVudCAhPSBOVUxMKQorCQkgICAgY3R4dC0+bmJlbnRpdGllcyArPSBlbnQtPm93bmVyOwogCQlpZiAoKGVudCAhPSBOVUxMKSAmJgogCQkgICAgKGVudC0+ZXR5cGUgPT0gWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZKSkgewogCQkgICAgaWYgKGxlbiA+IGJ1Zl9zaXplIC0gMTApIHsKLQkJCWdyb3dCdWZmZXIoYnVmKTsKKwkJCWdyb3dCdWZmZXIoYnVmLCAxMCk7CiAJCSAgICB9CiAJCSAgICBpZiAoKGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9PSAwKSAmJgogCQkgICAgICAgIChlbnQtPmNvbnRlbnRbMF0gPT0gJyYnKSkgewpAQCAtMzE2OCw4ICszNjgxLDYgQEAKIAkJICAgIH0KIAkJfSBlbHNlIGlmICgoZW50ICE9IE5VTEwpICYmIAogCQkgICAgICAgICAgIChjdHh0LT5yZXBsYWNlRW50aXRpZXMgIT0gMCkpIHsKLQkJICAgIHhtbENoYXIgKnJlcDsKLQogCQkgICAgaWYgKGVudC0+ZXR5cGUgIT0gWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZKSB7CiAJCQlyZXAgPSB4bWxTdHJpbmdEZWNvZGVFbnRpdGllcyhjdHh0LCBlbnQtPmNvbnRlbnQsCiAJCQkJCQkgICAgICBYTUxfU1VCU1RJVFVURV9SRUYsCkBAIC0zMTc5LDE0ICszNjkwLDE1IEBACiAJCQkgICAgd2hpbGUgKCpjdXJyZW50ICE9IDApIHsgLyogbm9uIGlucHV0IGNvbnN1bWluZyAqLwogCQkJCWJ1ZltsZW4rK10gPSAqY3VycmVudCsrOwogCQkJCWlmIChsZW4gPiBidWZfc2l6ZSAtIDEwKSB7Ci0JCQkJICAgIGdyb3dCdWZmZXIoYnVmKTsKKwkJCQkgICAgZ3Jvd0J1ZmZlcihidWYsIDEwKTsKIAkJCQl9CiAJCQkgICAgfQogCQkJICAgIHhtbEZyZWUocmVwKTsKKwkJCSAgICByZXAgPSBOVUxMOwogCQkJfQogCQkgICAgfSBlbHNlIHsKIAkJCWlmIChsZW4gPiBidWZfc2l6ZSAtIDEwKSB7Ci0JCQkgICAgZ3Jvd0J1ZmZlcihidWYpOworCQkJICAgIGdyb3dCdWZmZXIoYnVmLCAxMCk7CiAJCQl9CiAJCQlpZiAoZW50LT5jb250ZW50ICE9IE5VTEwpCiAJCQkgICAgYnVmW2xlbisrXSA9IGVudC0+Y29udGVudFswXTsKQEAgLTMyMDEsMTkgKzM3MTMsMjAgQEAKIAkJICAgICAqLwogCQkgICAgaWYgKChlbnQtPmV0eXBlICE9IFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSkgJiYKIAkJCShlbnQtPmNvbnRlbnQgIT0gTlVMTCkpIHsKLQkJCXhtbENoYXIgKnJlcDsKIAkJCXJlcCA9IHhtbFN0cmluZ0RlY29kZUVudGl0aWVzKGN0eHQsIGVudC0+Y29udGVudCwKLQkJCQkJCSAgICAgIFhNTF9TVUJTVElUVVRFX1JFRiwgMCwgMCwgMCk7Ci0JCQlpZiAocmVwICE9IE5VTEwpCisJCQkJCQkgIFhNTF9TVUJTVElUVVRFX1JFRiwgMCwgMCwgMCk7CisJCQlpZiAocmVwICE9IE5VTEwpIHsKIAkJCSAgICB4bWxGcmVlKHJlcCk7CisJCQkgICAgcmVwID0gTlVMTDsKKwkJCX0KIAkJICAgIH0KIAogCQkgICAgLyoKIAkJICAgICAqIEp1c3Qgb3V0cHV0IHRoZSByZWZlcmVuY2UKIAkJICAgICAqLwogCQkgICAgYnVmW2xlbisrXSA9ICcmJzsKLQkJICAgIGlmIChsZW4gPiBidWZfc2l6ZSAtIGkgLSAxMCkgewotCQkJZ3Jvd0J1ZmZlcihidWYpOworCQkgICAgd2hpbGUgKGxlbiA+IGJ1Zl9zaXplIC0gaSAtIDEwKSB7CisJCQlncm93QnVmZmVyKGJ1ZiwgaSArIDEwKTsKIAkJICAgIH0KIAkJICAgIGZvciAoO2kgPiAwO2ktLSkKIAkJCWJ1ZltsZW4rK10gPSAqY3VyKys7CkBAIC0zMjI1LDggKzM3MzgsOCBAQAogCSAgICAgICAgaWYgKChsZW4gIT0gMCkgfHwgKCFub3JtYWxpemUpKSB7CiAJCSAgICBpZiAoKCFub3JtYWxpemUpIHx8ICghaW5fc3BhY2UpKSB7CiAJCQlDT1BZX0JVRihsLGJ1ZixsZW4sMHgyMCk7Ci0JCQlpZiAobGVuID4gYnVmX3NpemUgLSAxMCkgewotCQkJICAgIGdyb3dCdWZmZXIoYnVmKTsKKwkJCXdoaWxlIChsZW4gPiBidWZfc2l6ZSAtIDEwKSB7CisJCQkgICAgZ3Jvd0J1ZmZlcihidWYsIDEwKTsKIAkJCX0KIAkJICAgIH0KIAkJICAgIGluX3NwYWNlID0gMTsKQEAgLTMyMzUsNyArMzc0OCw3IEBACiAJICAgICAgICBpbl9zcGFjZSA9IDA7CiAJCUNPUFlfQlVGKGwsYnVmLGxlbixjKTsKIAkJaWYgKGxlbiA+IGJ1Zl9zaXplIC0gMTApIHsKLQkJICAgIGdyb3dCdWZmZXIoYnVmKTsKKwkJICAgIGdyb3dCdWZmZXIoYnVmLCAxMCk7CiAJCX0KIAkgICAgfQogCSAgICBORVhUTChsKTsKQEAgLTMyNjQsNiArMzc3NywxMCBAQAogCiBtZW1fZXJyb3I6CiAgICAgeG1sRXJyTWVtb3J5KGN0eHQsIE5VTEwpOworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICAgICAgeG1sRnJlZShidWYpOworICAgIGlmIChyZXAgIT0gTlVMTCkKKyAgICAgICAgeG1sRnJlZShyZXApOwogICAgIHJldHVybihOVUxMKTsKIH0KIApAQCAtMzYyNSw2ICs0MTQyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGN0eHQtPmlucHV0LT5saW5lOwogICAgICAgICAgICAgICAgICAgICBjb2wgPSBjdHh0LT5pbnB1dC0+Y29sOwogCQl9CisgICAgICAgICAgICAgICAgLyogc29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQgaW4gdGhlIFNBWCBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgIGlmIChjdHh0LT5pbnN0YXRlICE9IFhNTF9QQVJTRVJfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCSAgICB9CiAJICAgIGN0eHQtPmlucHV0LT5jdXIgPSBpbjsKIAkgICAgaWYgKCppbiA9PSAweEQpIHsKQEAgLTM3MDUsNiArNDIyNSw5IEBACiAJCX0KIAkgICAgfQogCSAgICBuYmNoYXIgPSAwOworICAgICAgICAgICAgLyogc29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQgaW4gdGhlIFNBWCBjYWxsYmFjayAqLworICAgICAgICAgICAgaWYgKGN0eHQtPmluc3RhdGUgIT0gWE1MX1BBUlNFUl9DT05URU5UKQorICAgICAgICAgICAgICAgIHJldHVybjsKIAl9CiAJY291bnQrKzsKIAlpZiAoY291bnQgPiA1MCkgewpAQCAtMzg0Myw4ICs0MzY2LDEwIEBACiAgICAgaW50IHEsIHFsOwogICAgIGludCByLCBybDsKICAgICBpbnQgY3VyLCBsOwotICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0ID0gY3R4dC0+aW5wdXQ7CiAgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgaW5wdXRpZDsKKworICAgIGlucHV0aWQgPSBjdHh0LT5pbnB1dC0+aWQ7CiAKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgbGVuID0gMDsKQEAgLTM5MjYsNyArNDQ1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxQYXJzZUNvbW1lbnQ6IGludmFsaWQgeG1sQ2hhciB2YWx1ZSAlZFxuIiwKIAkgICAgICAgICAgICAgICAgICBjdXIpOwogICAgIH0gZWxzZSB7Ci0JaWYgKGlucHV0ICE9IGN0eHQtPmlucHV0KSB7CisJaWYgKGlucHV0aWQgIT0gY3R4dC0+aW5wdXQtPmlkKSB7CiAJICAgIHhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfRU5USVRZX0JPVU5EQVJZLAogCQkiQ29tbWVudCBkb2Vzbid0IHN0YXJ0IGFuZCBzdG9wIGluIHRoZSBzYW1lIGVudGl0eVxuIik7CiAJfQpAQCAtMzk2MiwxNSArNDQ4NywxNiBAQAogICAgIHhtbFBhcnNlcklucHV0U3RhdGUgc3RhdGU7CiAgICAgY29uc3QgeG1sQ2hhciAqaW47CiAgICAgaW50IG5iY2hhciA9IDAsIGNjb2w7CisgICAgaW50IGlucHV0aWQ7CiAKICAgICAvKgogICAgICAqIENoZWNrIHRoYXQgdGhlcmUgaXMgYSBjb21tZW50IHJpZ2h0IGhlcmUuCiAgICAgICovCiAgICAgaWYgKChSQVcgIT0gJzwnKSB8fCAoTlhUKDEpICE9ICchJykgfHwKICAgICAgICAgKE5YVCgyKSAhPSAnLScpIHx8IChOWFQoMykgIT0gJy0nKSkgcmV0dXJuOwotCiAgICAgc3RhdGUgPSBjdHh0LT5pbnN0YXRlOwogICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTU1FTlQ7CisgICAgaW5wdXRpZCA9IGN0eHQtPmlucHV0LT5pZDsKICAgICBTS0lQKDQpOwogICAgIFNIUklOSzsKICAgICBHUk9XOwpAQCAtNDA2MSw2ICs0NTg3LDEwIEBACiAJaWYgKCppbiA9PSAnLScpIHsKIAkgICAgaWYgKGluWzFdID09ICctJykgewogCSAgICAgICAgaWYgKGluWzJdID09ICc+JykgeworCQkgICAgaWYgKGN0eHQtPmlucHV0LT5pZCAhPSBpbnB1dGlkKSB7CisJCQl4bWxGYXRhbEVyck1zZyhjdHh0LCBYTUxfRVJSX0VOVElUWV9CT1VOREFSWSwKKwkJCSJjb21tZW50IGRvZXNuJ3Qgc3RhcnQgYW5kIHN0b3AgaW4gdGhlIHNhbWUgZW50aXR5XG4iKTsKKwkJICAgIH0KIAkJICAgIFNLSVAoMyk7CiAJCSAgICBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5jb21tZW50ICE9IE5VTEwpICYmCiAJCSAgICAgICAgKCFjdHh0LT5kaXNhYmxlU0FYKSkgewpAQCAtNDEzNCw2ICs0NjY0LDEwIEBACiAJCSAgICAgICJ4bWxQYXJzZVBJVGFyZ2V0OiBpbnZhbGlkIG5hbWUgcHJlZml4ICd4bWwnXG4iLAogCQkgICAgICBOVUxMLCBOVUxMKTsKICAgICB9CisgICAgaWYgKChuYW1lICE9IE5VTEwpICYmICh4bWxTdHJjaHIobmFtZSwgJzonKSAhPSBOVUxMKSkgeworCXhtbE5zRXJyKGN0eHQsIFhNTF9OU19FUlJfQ09MT04sIAorCQkgImNvbG9uIGFyZSBmb3JiaWRkZW4gZnJvbSBQSSBuYW1lcyAnJXMnXG4iLCBuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICB9CiAgICAgcmV0dXJuKG5hbWUpOwogfQogCkBAIC00Mzc3LDYgKzQ5MTEsMTEgQEAKIAkJICAgICAiU3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhlIE5PVEFUSU9OIG5hbWUnXG4iKTsKIAkgICAgcmV0dXJuOwogCX0KKwlpZiAoeG1sU3RyY2hyKG5hbWUsICc6JykgIT0gTlVMTCkgeworCSAgICB4bWxOc0VycihjdHh0LCBYTUxfTlNfRVJSX0NPTE9OLCAKKwkJICAgICAiY29sb24gYXJlIGZvcmJpZGRlbiBmcm9tIG5vdGF0aW9uIG5hbWVzICclcydcbiIsCisJCSAgICAgbmFtZSwgTlVMTCwgTlVMTCk7CisJfQogCVNLSVBfQkxBTktTOwogCiAJLyoKQEAgLTQ0NjEsNiArNTAwMCwxMSBAQAogCSAgICAgICAgICAgICAgICAgICAieG1sUGFyc2VFbnRpdHlEZWNsOiBubyBuYW1lXG4iKTsKICAgICAgICAgICAgIHJldHVybjsKIAl9CisJaWYgKHhtbFN0cmNocihuYW1lLCAnOicpICE9IE5VTEwpIHsKKwkgICAgeG1sTnNFcnIoY3R4dCwgWE1MX05TX0VSUl9DT0xPTiwgCisJCSAgICAgImNvbG9uIGFyZSBmb3JiaWRkZW4gZnJvbSBlbnRpdGllcyBuYW1lcyAnJXMnXG4iLAorCQkgICAgIG5hbWUsIE5VTEwsIE5VTEwpOworCX0KICAgICAgICAgc2tpcHBlZCA9IFNLSVBfQkxBTktTOwogCWlmIChza2lwcGVkID09IDApIHsKIAkgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9TUEFDRV9SRVFVSVJFRCwKQEAgLTQ1MzIsNiArNTA3NiwxMSBAQAogCQkgICAgKHhtbFN0ckVxdWFsKGN0eHQtPm15RG9jLT52ZXJzaW9uLCBTQVhfQ09NUEFUX01PREUpKSkgewogCQkgICAgaWYgKGN0eHQtPm15RG9jID09IE5VTEwpIHsKIAkJCWN0eHQtPm15RG9jID0geG1sTmV3RG9jKFNBWF9DT01QQVRfTU9ERSk7CisJCQlpZiAoY3R4dC0+bXlEb2MgPT0gTlVMTCkgeworCQkJICAgIHhtbEVyck1lbW9yeShjdHh0LCAiTmV3IERvYyBmYWlsZWQiKTsKKwkJCSAgICByZXR1cm47CisJCQl9CisJCQljdHh0LT5teURvYy0+cHJvcGVydGllcyA9IFhNTF9ET0NfSU5URVJOQUw7CiAJCSAgICB9CiAJCSAgICBpZiAoY3R4dC0+bXlEb2MtPmludFN1YnNldCA9PSBOVUxMKQogCQkJY3R4dC0+bXlEb2MtPmludFN1YnNldCA9IHhtbE5ld0R0ZChjdHh0LT5teURvYywKQEAgLTQ2MDAsNiArNTE0OSwxMSBAQAogCQkJKHhtbFN0ckVxdWFsKGN0eHQtPm15RG9jLT52ZXJzaW9uLCBTQVhfQ09NUEFUX01PREUpKSkpIHsKIAkJCWlmIChjdHh0LT5teURvYyA9PSBOVUxMKSB7CiAJCQkgICAgY3R4dC0+bXlEb2MgPSB4bWxOZXdEb2MoU0FYX0NPTVBBVF9NT0RFKTsKKwkJCSAgICBpZiAoY3R4dC0+bXlEb2MgPT0gTlVMTCkgeworCQkJICAgICAgICB4bWxFcnJNZW1vcnkoY3R4dCwgIk5ldyBEb2MgZmFpbGVkIik7CisJCQkJcmV0dXJuOworCQkJICAgIH0KKwkJCSAgICBjdHh0LT5teURvYy0+cHJvcGVydGllcyA9IFhNTF9ET0NfSU5URVJOQUw7CiAJCQl9CiAKIAkJCWlmIChjdHh0LT5teURvYy0+aW50U3Vic2V0ID09IE5VTEwpCkBAIC00NzM4LDcgKzUyOTIsNyBAQAogeG1sRW51bWVyYXRpb25QdHIKIHhtbFBhcnNlTm90YXRpb25UeXBlKHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgewogICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7Ci0gICAgeG1sRW51bWVyYXRpb25QdHIgcmV0ID0gTlVMTCwgbGFzdCA9IE5VTEwsIGN1cjsKKyAgICB4bWxFbnVtZXJhdGlvblB0ciByZXQgPSBOVUxMLCBsYXN0ID0gTlVMTCwgY3VyLCB0bXA7CiAKICAgICBpZiAoUkFXICE9ICcoJykgewogCXhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfTk9UQVRJT05fTk9UX1NUQVJURUQsIE5VTEwpOwpAQCAtNDc1NCwxMiArNTMwOCwyNiBAQAogCQkJICAgIk5hbWUgZXhwZWN0ZWQgaW4gTk9UQVRJT04gZGVjbGFyYXRpb25cbiIpOwogCSAgICByZXR1cm4ocmV0KTsKIAl9Ci0JY3VyID0geG1sQ3JlYXRlRW51bWVyYXRpb24obmFtZSk7Ci0JaWYgKGN1ciA9PSBOVUxMKSByZXR1cm4ocmV0KTsKLQlpZiAobGFzdCA9PSBOVUxMKSByZXQgPSBsYXN0ID0gY3VyOwotCWVsc2UgewotCSAgICBsYXN0LT5uZXh0ID0gY3VyOwotCSAgICBsYXN0ID0gY3VyOworCXRtcCA9IHJldDsKKwl3aGlsZSAodG1wICE9IE5VTEwpIHsKKwkgICAgaWYgKHhtbFN0ckVxdWFsKG5hbWUsIHRtcC0+bmFtZSkpIHsKKwkJeG1sVmFsaWRpdHlFcnJvcihjdHh0LCBYTUxfRFREX0RVUF9UT0tFTiwKKwkgICJzdGFuZGFsb25lOiBhdHRyaWJ1dGUgbm90YXRpb24gdmFsdWUgdG9rZW4gJXMgZHVwbGljYXRlZFxuIiwKKwkJCQkgbmFtZSwgTlVMTCk7CisJCWlmICgheG1sRGljdE93bnMoY3R4dC0+ZGljdCwgbmFtZSkpCisJCSAgICB4bWxGcmVlKCh4bWxDaGFyICopIG5hbWUpOworCQlicmVhazsKKwkgICAgfQorCSAgICB0bXAgPSB0bXAtPm5leHQ7CisJfQorCWlmICh0bXAgPT0gTlVMTCkgeworCSAgICBjdXIgPSB4bWxDcmVhdGVFbnVtZXJhdGlvbihuYW1lKTsKKwkgICAgaWYgKGN1ciA9PSBOVUxMKSByZXR1cm4ocmV0KTsKKwkgICAgaWYgKGxhc3QgPT0gTlVMTCkgcmV0ID0gbGFzdCA9IGN1cjsKKwkgICAgZWxzZSB7CisJCWxhc3QtPm5leHQgPSBjdXI7CisJCWxhc3QgPSBjdXI7CisJICAgIH0KIAl9CiAJU0tJUF9CTEFOS1M7CiAgICAgfSB3aGlsZSAoUkFXID09ICd8Jyk7CkBAIC00NzkxLDcgKzUzNTksNyBAQAogeG1sRW51bWVyYXRpb25QdHIKIHhtbFBhcnNlRW51bWVyYXRpb25UeXBlKHhtbFBhcnNlckN0eHRQdHIgY3R4dCkgewogICAgIHhtbENoYXIgKm5hbWU7Ci0gICAgeG1sRW51bWVyYXRpb25QdHIgcmV0ID0gTlVMTCwgbGFzdCA9IE5VTEwsIGN1cjsKKyAgICB4bWxFbnVtZXJhdGlvblB0ciByZXQgPSBOVUxMLCBsYXN0ID0gTlVMTCwgY3VyLCB0bXA7CiAKICAgICBpZiAoUkFXICE9ICcoJykgewogCXhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfQVRUTElTVF9OT1RfU1RBUlRFRCwgTlVMTCk7CkBAIC00ODA2LDEzICs1Mzc0LDI4IEBACiAJICAgIHhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfTk1UT0tFTl9SRVFVSVJFRCwgTlVMTCk7CiAJICAgIHJldHVybihyZXQpOwogCX0KLQljdXIgPSB4bWxDcmVhdGVFbnVtZXJhdGlvbihuYW1lKTsKLQl4bWxGcmVlKG5hbWUpOwotCWlmIChjdXIgPT0gTlVMTCkgcmV0dXJuKHJldCk7Ci0JaWYgKGxhc3QgPT0gTlVMTCkgcmV0ID0gbGFzdCA9IGN1cjsKLQllbHNlIHsKLQkgICAgbGFzdC0+bmV4dCA9IGN1cjsKLQkgICAgbGFzdCA9IGN1cjsKKwl0bXAgPSByZXQ7CisJd2hpbGUgKHRtcCAhPSBOVUxMKSB7CisJICAgIGlmICh4bWxTdHJFcXVhbChuYW1lLCB0bXAtPm5hbWUpKSB7CisJCXhtbFZhbGlkaXR5RXJyb3IoY3R4dCwgWE1MX0RURF9EVVBfVE9LRU4sCisJICAic3RhbmRhbG9uZTogYXR0cmlidXRlIGVudW1lcmF0aW9uIHZhbHVlIHRva2VuICVzIGR1cGxpY2F0ZWRcbiIsCisJCQkJIG5hbWUsIE5VTEwpOworCQlpZiAoIXhtbERpY3RPd25zKGN0eHQtPmRpY3QsIG5hbWUpKQorCQkgICAgeG1sRnJlZShuYW1lKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgdG1wID0gdG1wLT5uZXh0OworCX0KKwlpZiAodG1wID09IE5VTEwpIHsKKwkgICAgY3VyID0geG1sQ3JlYXRlRW51bWVyYXRpb24obmFtZSk7CisJICAgIGlmICgheG1sRGljdE93bnMoY3R4dC0+ZGljdCwgbmFtZSkpCisJCXhtbEZyZWUobmFtZSk7CisJICAgIGlmIChjdXIgPT0gTlVMTCkgcmV0dXJuKHJldCk7CisJICAgIGlmIChsYXN0ID09IE5VTEwpIHJldCA9IGxhc3QgPSBjdXI7CisJICAgIGVsc2UgeworCQlsYXN0LT5uZXh0ID0gY3VyOworCQlsYXN0ID0gY3VyOworCSAgICB9CiAJfQogCVNLSVBfQkxBTktTOwogICAgIH0gd2hpbGUgKFJBVyA9PSAnfCcpOwpAQCAtNTAxMyw2ICs1NTk2LDggQEAKIAkJICAgIHhtbEZyZWVFbnVtZXJhdGlvbih0cmVlKTsKIAkgICAgICAgIGJyZWFrOwogCSAgICB9CisJICAgIGlmICgodHlwZSAhPSBYTUxfQVRUUklCVVRFX0NEQVRBKSAmJiAoZGVmYXVsdFZhbHVlICE9IE5VTEwpKQorCSAgICAgICAgeG1sQXR0ck5vcm1hbGl6ZVNwYWNlKGRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlKTsKIAogCSAgICBHUk9XOwogICAgICAgICAgICAgaWYgKFJBVyAhPSAnPicpIHsKQEAgLTUwNTcsOCArNTY0Miw5IEBACiAJfQogCWlmIChSQVcgPT0gJz4nKSB7CiAJICAgIGlmIChpbnB1dCAhPSBjdHh0LT5pbnB1dCkgewotCQl4bWxGYXRhbEVyck1zZyhjdHh0LCBYTUxfRVJSX0VOVElUWV9CT1VOREFSWSwKLSAgICAiQXR0cmlidXRlIGxpc3QgZGVjbGFyYXRpb24gZG9lc24ndCBzdGFydCBhbmQgc3RvcCBpbiB0aGUgc2FtZSBlbnRpdHlcbiIpOworCQl4bWxWYWxpZGl0eUVycm9yKGN0eHQsIFhNTF9FUlJfRU5USVRZX0JPVU5EQVJZLAorICAgICJBdHRyaWJ1dGUgbGlzdCBkZWNsYXJhdGlvbiBkb2Vzbid0IHN0YXJ0IGFuZCBzdG9wIGluIHRoZSBzYW1lIGVudGl0eVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogCSAgICB9CiAJICAgIE5FWFQ7CiAJfQpAQCAtNTA5OCwxMCArNTY4NCwxMiBAQAogCSAgICBpZiAoKGN0eHQtPnZhbGlkYXRlKSAmJiAoY3R4dC0+aW5wdXQtPmlkICE9IGlucHV0Y2hrKSkgewogCQl4bWxWYWxpZGl0eUVycm9yKGN0eHQsIFhNTF9FUlJfRU5USVRZX0JPVU5EQVJZLAogIkVsZW1lbnQgY29udGVudCBkZWNsYXJhdGlvbiBkb2Vzbid0IHN0YXJ0IGFuZCBzdG9wIGluIHRoZSBzYW1lIGVudGl0eVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAJICAgIH0KIAkgICAgTkVYVDsKIAkgICAgcmV0ID0geG1sTmV3RG9jRWxlbWVudENvbnRlbnQoY3R4dC0+bXlEb2MsIE5VTEwsIFhNTF9FTEVNRU5UX0NPTlRFTlRfUENEQVRBKTsKKwkgICAgaWYgKHJldCA9PSBOVUxMKQorCSAgICAgICAgcmV0dXJuKE5VTEwpOwogCSAgICBpZiAoUkFXID09ICcqJykgewogCQlyZXQtPm9jdXIgPSBYTUxfRUxFTUVOVF9DT05URU5UX01VTFQ7CiAJCU5FWFQ7CkBAIC01MTU0LDcgKzU3NDIsNyBAQAogCSAgICBpZiAoKGN0eHQtPnZhbGlkYXRlKSAmJiAoY3R4dC0+aW5wdXQtPmlkICE9IGlucHV0Y2hrKSkgewogCQl4bWxWYWxpZGl0eUVycm9yKGN0eHQsIFhNTF9FUlJfRU5USVRZX0JPVU5EQVJZLAogIkVsZW1lbnQgY29udGVudCBkZWNsYXJhdGlvbiBkb2Vzbid0IHN0YXJ0IGFuZCBzdG9wIGluIHRoZSBzYW1lIGVudGl0eVxuIiwKLQkJCQkgTlVMTCk7CisJCQkJIE5VTEwsIE5VTEwpOwogCSAgICB9CiAJICAgIFNLSVAoMik7CiAJfSBlbHNlIHsKQEAgLTUzMzIsNiArNTkyMCw4IEBACiAJICAgIH0KIAl9IGVsc2UgewogCSAgICB4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VMRU1DT05URU5UX05PVF9GSU5JU0hFRCwgTlVMTCk7CisJICAgIGlmICgobGFzdCAhPSBOVUxMKSAmJiAobGFzdCAhPSByZXQpKQorCSAgICAgICAgeG1sRnJlZURvY0VsZW1lbnRDb250ZW50KGN0eHQtPm15RG9jLCBsYXN0KTsKIAkgICAgaWYgKHJldCAhPSBOVUxMKQogCQl4bWxGcmVlRG9jRWxlbWVudENvbnRlbnQoY3R4dC0+bXlEb2MsIHJldCk7CiAJICAgIHJldHVybihOVUxMKTsKQEAgLTUzNTUsNiArNTk0NSwxMSBAQAogCQlyZXR1cm4oTlVMTCk7CiAJICAgIH0KIAkgICAgbGFzdCA9IHhtbE5ld0RvY0VsZW1lbnRDb250ZW50KGN0eHQtPm15RG9jLCBlbGVtLCBYTUxfRUxFTUVOVF9DT05URU5UX0VMRU1FTlQpOworCSAgICBpZiAobGFzdCA9PSBOVUxMKSB7CisJCWlmIChyZXQgIT0gTlVMTCkKKwkJICAgIHhtbEZyZWVEb2NFbGVtZW50Q29udGVudChjdHh0LT5teURvYywgcmV0KTsKKwkJcmV0dXJuKE5VTEwpOworCSAgICB9CiAJICAgIGlmIChSQVcgPT0gJz8nKSB7CiAJCWxhc3QtPm9jdXIgPSBYTUxfRUxFTUVOVF9DT05URU5UX09QVDsKIAkJTkVYVDsKQEAgLTUzNzksNyArNTk3NCw3IEBACiAgICAgaWYgKChjdHh0LT52YWxpZGF0ZSkgJiYgKGN0eHQtPmlucHV0LT5pZCAhPSBpbnB1dGNoaykpIHsKIAl4bWxWYWxpZGl0eUVycm9yKGN0eHQsIFhNTF9FUlJfRU5USVRZX0JPVU5EQVJZLAogIkVsZW1lbnQgY29udGVudCBkZWNsYXJhdGlvbiBkb2Vzbid0IHN0YXJ0IGFuZCBzdG9wIGluIHRoZSBzYW1lIGVudGl0eVxuIiwKLQkJCSBOVUxMKTsKKwkJCSBOVUxMLCBOVUxMKTsKICAgICB9CiAgICAgTkVYVDsKICAgICBpZiAoUkFXID09ICc/JykgewpAQCAtNTYyMSw2ICs2MjE2LDggQEAKIAogc3RhdGljIHZvaWQKIHhtbFBhcnNlQ29uZGl0aW9uYWxTZWN0aW9ucyh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKKyAgICBpbnQgaWQgPSBjdHh0LT5pbnB1dC0+aWQ7CisKICAgICBTS0lQKDMpOwogICAgIFNLSVBfQkxBTktTOwogICAgIGlmIChDTVA3KENVUl9QVFIsICdJJywgJ04nLCAnQycsICdMJywgJ1UnLCAnRCcsICdFJykpIHsKQEAgLTU2MjksNiArNjIyNiwxMSBAQAogCWlmIChSQVcgIT0gJ1snKSB7CiAJICAgIHhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfQ09ORFNFQ19JTlZBTElELCBOVUxMKTsKIAl9IGVsc2UgeworCSAgICBpZiAoY3R4dC0+aW5wdXQtPmlkICE9IGlkKSB7CisJCXhtbFZhbGlkaXR5RXJyb3IoY3R4dCwgWE1MX0VSUl9FTlRJVFlfQk9VTkRBUlksCisJICAgICJBbGwgbWFya3VwIG9mIHRoZSBjb25kaXRpb25hbCBzZWN0aW9uIGlzIG5vdCBpbiB0aGUgc2FtZSBlbnRpdHlcbiIsCisJCQkJICAgICBOVUxMLCBOVUxMKTsKKwkgICAgfQogCSAgICBORVhUOwogCX0KIAlpZiAoeG1sUGFyc2VyRGVidWdFbnRpdGllcykgewpAQCAtNTY4NCw2ICs2Mjg2LDExIEBACiAJaWYgKFJBVyAhPSAnWycpIHsKIAkgICAgeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9DT05EU0VDX0lOVkFMSUQsIE5VTEwpOwogCX0gZWxzZSB7CisJICAgIGlmIChjdHh0LT5pbnB1dC0+aWQgIT0gaWQpIHsKKwkJeG1sVmFsaWRpdHlFcnJvcihjdHh0LCBYTUxfRVJSX0VOVElUWV9CT1VOREFSWSwKKwkgICAgIkFsbCBtYXJrdXAgb2YgdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24gaXMgbm90IGluIHRoZSBzYW1lIGVudGl0eVxuIiwKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCSAgICB9CiAJICAgIE5FWFQ7CiAJfQogCWlmICh4bWxQYXJzZXJEZWJ1Z0VudGl0aWVzKSB7CkBAIC01NzQwLDYgKzYzNDcsMTEgQEAKICAgICBpZiAoUkFXID09IDApIHsKIAl4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0NPTkRTRUNfTk9UX0ZJTklTSEVELCBOVUxMKTsKICAgICB9IGVsc2UgeworCWlmIChjdHh0LT5pbnB1dC0+aWQgIT0gaWQpIHsKKwkgICAgeG1sVmFsaWRpdHlFcnJvcihjdHh0LCBYTUxfRVJSX0VOVElUWV9CT1VOREFSWSwKKwkiQWxsIG1hcmt1cCBvZiB0aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBpcyBub3QgaW4gdGhlIHNhbWUgZW50aXR5XG4iLAorCQkJCSBOVUxMLCBOVUxMKTsKKwl9CiAgICAgICAgIFNLSVAoMyk7CiAgICAgfQogfQpAQCAtNTgxOCwxMiArNjQzMCwxMCBAQAogLyoqCiAgKiB4bWxQYXJzZVRleHREZWNsOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKLSAqIAorICoKICAqIHBhcnNlIGFuIFhNTCBkZWNsYXJhdGlvbiBoZWFkZXIgZm9yIGV4dGVybmFsIGVudGl0aWVzCiAgKgogICogWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicKLSAqCi0gKiBRdWVzdGlvbjogU2VlbXMgdGhhdCBFbmNvZGluZ0RlY2wgaXMgbWFuZGF0b3J5ID8gSXMgdGhhdCBhIHR5cG8gPwogICovCiAKIHZvaWQKQEAgLTU5MDcsNiArNjUxNywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpTeXN0ZW1JRCkgewogICAgIHhtbERldGVjdFNBWDIoY3R4dCk7CiAgICAgR1JPVzsKKworICAgIGlmICgoY3R4dC0+ZW5jb2RpbmcgPT0gKGNvbnN0IHhtbENoYXIgKilYTUxfQ0hBUl9FTkNPRElOR19OT05FKSAmJgorICAgICAgICAoY3R4dC0+aW5wdXQtPmVuZCAtIGN0eHQtPmlucHV0LT5jdXIgPj0gNCkpIHsKKyAgICAgICAgeG1sQ2hhciBzdGFydFs0XTsKKwl4bWxDaGFyRW5jb2RpbmcgZW5jOworCisJc3RhcnRbMF0gPSBSQVc7CisJc3RhcnRbMV0gPSBOWFQoMSk7CisJc3RhcnRbMl0gPSBOWFQoMik7CisJc3RhcnRbM10gPSBOWFQoMyk7CisJZW5jID0geG1sRGV0ZWN0Q2hhckVuY29kaW5nKHN0YXJ0LCA0KTsKKwlpZiAoZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpCisJICAgIHhtbFN3aXRjaEVuY29kaW5nKGN0eHQsIGVuYyk7CisgICAgfQorCiAgICAgaWYgKENNUDUoQ1VSX1BUUiwgJzwnLCAnPycsICd4JywgJ20nLCAnbCcpKSB7CiAJeG1sUGFyc2VUZXh0RGVjbChjdHh0KTsKIAlpZiAoY3R4dC0+ZXJyTm8gPT0gWE1MX0VSUl9VTlNVUFBPUlRFRF9FTkNPRElORykgewpAQCAtNTkxOSw2ICs2NTQ0LDExIEBACiAgICAgfQogICAgIGlmIChjdHh0LT5teURvYyA9PSBOVUxMKSB7CiAgICAgICAgIGN0eHQtPm15RG9jID0geG1sTmV3RG9jKEJBRF9DQVNUICIxLjAiKTsKKwlpZiAoY3R4dC0+bXlEb2MgPT0gTlVMTCkgeworCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgIk5ldyBEb2MgZmFpbGVkIik7CisJICAgIHJldHVybjsKKwl9CisJY3R4dC0+bXlEb2MtPnByb3BlcnRpZXMgPSBYTUxfRE9DX0lOVEVSTkFMOwogICAgIH0KICAgICBpZiAoKGN0eHQtPm15RG9jICE9IE5VTEwpICYmIChjdHh0LT5teURvYy0+aW50U3Vic2V0ID09IE5VTEwpKQogICAgICAgICB4bWxDcmVhdGVJbnRTdWJzZXQoY3R4dC0+bXlEb2MsIE5VTEwsIEV4dGVybmFsSUQsIFN5c3RlbUlEKTsKQEAgLTU5NjIsNyArNjU5Miw3IEBACiAvKioKICAqIHhtbFBhcnNlUmVmZXJlbmNlOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKLSAqIAorICoKICAqIHBhcnNlIGFuZCBoYW5kbGUgZW50aXR5IHJlZmVyZW5jZXMgaW4gY29udGVudCwgZGVwZW5kaW5nIG9uIHRoZSBTQVgKICAqIGludGVyZmFjZSwgdGhpcyBtYXkgZW5kLXVwIGluIGEgY2FsbCB0byBjaGFyYWN0ZXIoKSBpZiB0aGlzIGlzIGEKICAqIENoYXJSZWYsIGEgcHJlZGVmaW5lZCBlbnRpdHksIGlmIHRoZXJlIGlzIG5vIHJlZmVyZW5jZSgpIGNhbGxiYWNrLgpAQCAtNTk3NCwxNCArNjYwNCwyNSBAQAogeG1sUGFyc2VSZWZlcmVuY2UoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CiAgICAgeG1sRW50aXR5UHRyIGVudDsKICAgICB4bWxDaGFyICp2YWw7Ci0gICAgaWYgKFJBVyAhPSAnJicpIHJldHVybjsKKyAgICBpbnQgd2FzX2NoZWNrZWQ7CisgICAgeG1sTm9kZVB0ciBsaXN0ID0gTlVMTDsKKyAgICB4bWxQYXJzZXJFcnJvcnMgcmV0ID0gWE1MX0VSUl9PSzsKIAorCisgICAgaWYgKFJBVyAhPSAnJicpCisgICAgICAgIHJldHVybjsKKworICAgIC8qCisgICAgICogU2ltcGxlIGNhc2Ugb2YgYSBDaGFyUmVmCisgICAgICovCiAgICAgaWYgKE5YVCgxKSA9PSAnIycpIHsKIAlpbnQgaSA9IDA7CiAJeG1sQ2hhciBvdXRbMTBdOwogCWludCBoZXggPSBOWFQoMik7CiAJaW50IHZhbHVlID0geG1sUGFyc2VDaGFyUmVmKGN0eHQpOwotCQorCisJaWYgKHZhbHVlID09IDApCisJICAgIHJldHVybjsKIAlpZiAoY3R4dC0+Y2hhcnNldCAhPSBYTUxfQ0hBUl9FTkNPRElOR19VVEY4KSB7CiAJICAgIC8qCiAJICAgICAqIFNvIHdlIGFyZSB1c2luZyBub24tVVRGLTggYnVmZmVycwpAQCAtNjAxMywzNjAgKzY2NTQsMzQyIEBACiAJCSghY3R4dC0+ZGlzYWJsZVNBWCkpCiAJCWN0eHQtPnNheC0+Y2hhcmFjdGVycyhjdHh0LT51c2VyRGF0YSwgb3V0LCBpKTsKIAl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHdhc19jaGVja2VkOworCXJldHVybjsKKyAgICB9CiAKLQllbnQgPSB4bWxQYXJzZUVudGl0eVJlZihjdHh0KTsKLQlpZiAoZW50ID09IE5VTEwpIHJldHVybjsKLQlpZiAoIWN0eHQtPndlbGxGb3JtZWQpCisgICAgLyoKKyAgICAgKiBXZSBhcmUgc2VlaW5nIGFuIGVudGl0eSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBlbnQgPSB4bWxQYXJzZUVudGl0eVJlZihjdHh0KTsKKyAgICBpZiAoZW50ID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAoIWN0eHQtPndlbGxGb3JtZWQpCisJcmV0dXJuOworICAgIHdhc19jaGVja2VkID0gZW50LT5jaGVja2VkOworCisgICAgLyogc3BlY2lhbCBjYXNlIG9mIHByZWRlZmluZWQgZW50aXRpZXMgKi8KKyAgICBpZiAoKGVudC0+bmFtZSA9PSBOVUxMKSB8fAorICAgICAgICAoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFkpKSB7CisJdmFsID0gZW50LT5jb250ZW50OworCWlmICh2YWwgPT0gTlVMTCkgcmV0dXJuOworCS8qCisJICogaW5saW5lIHRoZSBlbnRpdHkuCisJICovCisJaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+Y2hhcmFjdGVycyAhPSBOVUxMKSAmJgorCSAgICAoIWN0eHQtPmRpc2FibGVTQVgpKQorCSAgICBjdHh0LT5zYXgtPmNoYXJhY3RlcnMoY3R4dC0+dXNlckRhdGEsIHZhbCwgeG1sU3RybGVuKHZhbCkpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCByZWZlcmVuY2UgdG8gdGhlIGVudGl0eSB0cmlnZ2VyIGEgcGFyc2luZyBwaGFzZQorICAgICAqIHdoZXJlIHRoZSBlbnQtPmNoaWxkcmVuIGlzIGZpbGxlZCB3aXRoIHRoZSByZXN1bHQgZnJvbQorICAgICAqIHRoZSBwYXJzaW5nLgorICAgICAqLworICAgIGlmIChlbnQtPmNoZWNrZWQgPT0gMCkgeworCXVuc2lnbmVkIGxvbmcgb2xkbmJlbnQgPSBjdHh0LT5uYmVudGl0aWVzOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IGhhY2tpc2ggYnV0IHRoaXMgc2VlbXMgdGhlIGJlc3QKKwkgKiB3YXkgdG8gbWFrZSBzdXJlIGJvdGggU0FYIGFuZCBET00gZW50aXR5IHN1cHBvcnQKKwkgKiBiZWhhdmVzIG9rYXkuCisJICovCisJdm9pZCAqdXNlcl9kYXRhOworCWlmIChjdHh0LT51c2VyRGF0YSA9PSBjdHh0KQorCSAgICB1c2VyX2RhdGEgPSBOVUxMOworCWVsc2UKKwkgICAgdXNlcl9kYXRhID0gY3R4dC0+dXNlckRhdGE7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhpcyBlbnRpdHkgaXMgd2VsbCBmb3JtZWQKKwkgKiA0LjMuMjogQW4gaW50ZXJuYWwgZ2VuZXJhbCBwYXJzZWQgZW50aXR5IGlzIHdlbGwtZm9ybWVkCisJICogaWYgaXRzIHJlcGxhY2VtZW50IHRleHQgbWF0Y2hlcyB0aGUgcHJvZHVjdGlvbiBsYWJlbGVkCisJICogY29udGVudC4KKwkgKi8KKwlpZiAoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpIHsKKwkgICAgY3R4dC0+ZGVwdGgrKzsKKwkgICAgcmV0ID0geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5SW50ZXJuYWwoY3R4dCwgZW50LT5jb250ZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEsICZsaXN0KTsKKwkgICAgY3R4dC0+ZGVwdGgtLTsKKworCX0gZWxzZSBpZiAoZW50LT5ldHlwZSA9PSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZKSB7CisJICAgIGN0eHQtPmRlcHRoKys7CisJICAgIHJldCA9IHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHlQcml2YXRlKGN0eHQtPm15RG9jLCBjdHh0LCBjdHh0LT5zYXgsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEsIGN0eHQtPmRlcHRoLCBlbnQtPlVSSSwKKwkJCQkJICAgZW50LT5FeHRlcm5hbElELCAmbGlzdCk7CisJICAgIGN0eHQtPmRlcHRoLS07CisJfSBlbHNlIHsKKwkgICAgcmV0ID0gWE1MX0VSUl9FTlRJVFlfUEVfSU5URVJOQUw7CisJICAgIHhtbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAorCQkJICJpbnZhbGlkIGVudGl0eSB0eXBlIGZvdW5kXG4iLCBOVUxMKTsKKwl9CisKKwkvKgorCSAqIFN0b3JlIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgbmVlZGluZyBwYXJzaW5nIGZvciB0aGlzIGVudGl0eQorCSAqIGNvbnRlbnQgYW5kIGRvIGNoZWNraW5ncworCSAqLworCWVudC0+Y2hlY2tlZCA9IGN0eHQtPm5iZW50aXRpZXMgLSBvbGRuYmVudDsKKwlpZiAocmV0ID09IFhNTF9FUlJfRU5USVRZX0xPT1ApIHsKKwkgICAgeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlfTE9PUCwgTlVMTCk7CisJICAgIHhtbEZyZWVOb2RlTGlzdChsaXN0KTsKIAkgICAgcmV0dXJuOwotCXdhc19jaGVja2VkID0gZW50LT5jaGVja2VkOwotCWlmICgoZW50LT5uYW1lICE9IE5VTEwpICYmIAotCSAgICAoZW50LT5ldHlwZSAhPSBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFkpKSB7Ci0JICAgIHhtbE5vZGVQdHIgbGlzdCA9IE5VTEw7Ci0JICAgIHhtbFBhcnNlckVycm9ycyByZXQgPSBYTUxfRVJSX09LOworCX0KKwlpZiAoeG1sUGFyc2VyRW50aXR5Q2hlY2soY3R4dCwgMCwgZW50KSkgeworCSAgICB4bWxGcmVlTm9kZUxpc3QobGlzdCk7CisJICAgIHJldHVybjsKKwl9CiAKLQotCSAgICAvKgotCSAgICAgKiBUaGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBlbnRpdHkgdHJpZ2dlciBhIHBhcnNpbmcgcGhhc2UKLQkgICAgICogd2hlcmUgdGhlIGVudC0+Y2hpbGRyZW4gaXMgZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBmcm9tCi0JICAgICAqIHRoZSBwYXJzaW5nLgotCSAgICAgKi8KLQkgICAgaWYgKGVudC0+Y2hlY2tlZCA9PSAwKSB7Ci0JCXhtbENoYXIgKnZhbHVlOwotCi0JCXZhbHVlID0gZW50LT5jb250ZW50OwotCi0JCS8qCi0JCSAqIENoZWNrIHRoYXQgdGhpcyBlbnRpdHkgaXMgd2VsbCBmb3JtZWQKLQkJICovCi0JCWlmICgodmFsdWUgIT0gTlVMTCkgJiYgKHZhbHVlWzBdICE9IDApICYmCi0JCSAgICAodmFsdWVbMV0gPT0gMCkgJiYgKHZhbHVlWzBdID09ICc8JykgJiYKLQkJICAgICh4bWxTdHJFcXVhbChlbnQtPm5hbWUsIEJBRF9DQVNUICJsdCIpKSkgeworCWlmICgocmV0ID09IFhNTF9FUlJfT0spICYmIChsaXN0ICE9IE5VTEwpKSB7CisJICAgIGlmICgoKGVudC0+ZXR5cGUgPT0gWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZKSB8fAorCSAgICAgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkpJiYKKwkJKGVudC0+Y2hpbGRyZW4gPT0gTlVMTCkpIHsKKwkJZW50LT5jaGlsZHJlbiA9IGxpc3Q7CisJCWlmIChjdHh0LT5yZXBsYWNlRW50aXRpZXMpIHsKIAkJICAgIC8qCi0JCSAgICAgKiBET05FOiBnZXQgZGVmaW5pdGUgYW5zd2VyIG9uIHRoaXMgISEhCi0JCSAgICAgKiBMb3RzIG9mIGVudGl0eSBkZWNscyBhcmUgdXNlZCB0byBkZWNsYXJlIGEgc2luZ2xlCi0JCSAgICAgKiBjaGFyIAotCQkgICAgICogICAgPCFFTlRJVFkgbHQgICAgICI8Ij4KLQkJICAgICAqIFdoaWNoIHNlZW1zIHRvIGJlIHZhbGlkIHNpbmNlCi0JCSAgICAgKiAyLjQ6IFRoZSBhbXBlcnNhbmQgY2hhcmFjdGVyICgmKSBhbmQgdGhlIGxlZnQgYW5nbGUKLQkJICAgICAqIGJyYWNrZXQgKDwpIG1heSBhcHBlYXIgaW4gdGhlaXIgbGl0ZXJhbCBmb3JtIG9ubHkKLQkJICAgICAqIHdoZW4gdXNlZCAuLi4gVGhleSBhcmUgYWxzbyBsZWdhbCB3aXRoaW4gdGhlIGxpdGVyYWwKLQkJICAgICAqIGVudGl0eSB2YWx1ZSBvZiBhbiBpbnRlcm5hbCBlbnRpdHkgZGVjbGFyYXRpb247aQotCQkgICAgICogc2VlICI0LjMuMiBXZWxsLUZvcm1lZCBQYXJzZWQgRW50aXRpZXMiLiAKLQkJICAgICAqIElNSE8gMi40IGFuZCA0LjMuMiBhcmUgZGlyZWN0bHkgaW4gY29udHJhZGljdGlvbi4KLQkJICAgICAqIExvb2tpbmcgYXQgdGhlIE9BU0lTIHRlc3Qgc3VpdGUgYW5kIEphbWVzIENsYXJrIAotCQkgICAgICogdGVzdHMsIHRoaXMgaXMgYnJva2VuLiBIb3dldmVyIHRoZSBYTUwgUkVDIHVzZXMKLQkJICAgICAqIGl0LiBJcyB0aGUgWE1MIFJFQyBub3Qgd2VsbC1mb3JtZWQgPz8/PwotCQkgICAgICogVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgdGhpcyBwcm9ibGVtCi0JCSAgICAgKgotCQkgICAgICogQU5TV0VSOiBzaW5jZSBsdCBndCBhbXAgLi4gYXJlIGFscmVhZHkgZGVmaW5lZCwKLQkJICAgICAqICAgdGhpcyBpcyBhIHJlZGVmaW5pdGlvbiBhbmQgaGVuY2UgdGhlIGZhY3QgdGhhdCB0aGUKLQkJICAgICAqICAgY29udGVudCBpcyBub3Qgd2VsbCBiYWxhbmNlZCBpcyBub3QgYSBXZiBlcnJvciwgdGhpcwotCQkgICAgICogICBpcyBsb3VzeSBidXQgYWNjZXB0YWJsZS4KKwkJICAgICAqIFBydW5lIGl0IGRpcmVjdGx5IGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnQKKwkJICAgICAqIGV4Y2VwdCBmb3Igc2luZ2xlIHRleHQgbm9kZXMuCiAJCSAgICAgKi8KLQkJICAgIGxpc3QgPSB4bWxOZXdEb2NUZXh0KGN0eHQtPm15RG9jLCB2YWx1ZSk7Ci0JCSAgICBpZiAobGlzdCAhPSBOVUxMKSB7Ci0JCQlpZiAoKGVudC0+ZXR5cGUgPT0gWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZKSAmJgotCQkJICAgIChlbnQtPmNoaWxkcmVuID09IE5VTEwpKSB7Ci0JCQkgICAgZW50LT5jaGlsZHJlbiA9IGxpc3Q7Ci0JCQkgICAgZW50LT5sYXN0ID0gbGlzdDsKLQkJCSAgICBlbnQtPm93bmVyID0gMTsKLQkJCSAgICBsaXN0LT5wYXJlbnQgPSAoeG1sTm9kZVB0cikgZW50OwotCQkJfSBlbHNlIHsKLQkJCSAgICB4bWxGcmVlTm9kZUxpc3QobGlzdCk7CisJCSAgICBpZiAoKChsaXN0LT50eXBlID09IFhNTF9URVhUX05PREUpICYmCisJCQkgKGxpc3QtPm5leHQgPT0gTlVMTCkpIHx8CisJCQkoY3R4dC0+cGFyc2VNb2RlID09IFhNTF9QQVJTRV9SRUFERVIpKSB7CisJCQlsaXN0LT5wYXJlbnQgPSAoeG1sTm9kZVB0cikgZW50OworCQkJbGlzdCA9IE5VTEw7CisJCQllbnQtPm93bmVyID0gMTsKKwkJICAgIH0gZWxzZSB7CisJCQllbnQtPm93bmVyID0gMDsKKwkJCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKwkJCSAgICBsaXN0LT5wYXJlbnQgPSAoeG1sTm9kZVB0cikgY3R4dC0+bm9kZTsKKwkJCSAgICBsaXN0LT5kb2MgPSBjdHh0LT5teURvYzsKKwkJCSAgICBpZiAobGlzdC0+bmV4dCA9PSBOVUxMKQorCQkJCWVudC0+bGFzdCA9IGxpc3Q7CisJCQkgICAgbGlzdCA9IGxpc3QtPm5leHQ7CiAJCQl9Ci0JCSAgICB9IGVsc2UgaWYgKGxpc3QgIT0gTlVMTCkgewotCQkJeG1sRnJlZU5vZGVMaXN0KGxpc3QpOworCQkJbGlzdCA9IGVudC0+Y2hpbGRyZW47CisjaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECisJCQlpZiAoZW50LT5ldHlwZSA9PSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZKQorCQkJICB4bWxBZGRFbnRpdHlSZWZlcmVuY2UoZW50LCBsaXN0LCBOVUxMKTsKKyNlbmRpZiAvKiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQgKi8KIAkJICAgIH0KIAkJfSBlbHNlIHsKLQkJICAgIC8qCi0JCSAgICAgKiA0LjMuMjogQW4gaW50ZXJuYWwgZ2VuZXJhbCBwYXJzZWQgZW50aXR5IGlzIHdlbGwtZm9ybWVkCi0JCSAgICAgKiBpZiBpdHMgcmVwbGFjZW1lbnQgdGV4dCBtYXRjaGVzIHRoZSBwcm9kdWN0aW9uIGxhYmVsZWQKLQkJICAgICAqIGNvbnRlbnQuCi0JCSAgICAgKi8KLQotCQkgICAgdm9pZCAqdXNlcl9kYXRhOwotCQkgICAgLyoKLQkJICAgICAqIFRoaXMgaXMgYSBiaXQgaGFja2lzaCBidXQgdGhpcyBzZWVtcyB0aGUgYmVzdAotCQkgICAgICogd2F5IHRvIG1ha2Ugc3VyZSBib3RoIFNBWCBhbmQgRE9NIGVudGl0eSBzdXBwb3J0Ci0JCSAgICAgKiBiZWhhdmVzIG9rYXkuCi0JCSAgICAgKi8KLQkJICAgIGlmIChjdHh0LT51c2VyRGF0YSA9PSBjdHh0KQotCQkJdXNlcl9kYXRhID0gTlVMTDsKLQkJICAgIGVsc2UKLQkJCXVzZXJfZGF0YSA9IGN0eHQtPnVzZXJEYXRhOwotCi0JCSAgICBpZiAoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpIHsKLQkJCWN0eHQtPmRlcHRoKys7Ci0JCQlyZXQgPSB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlJbnRlcm5hbChjdHh0LAotCQkJCQkgICB2YWx1ZSwgdXNlcl9kYXRhLCAmbGlzdCk7Ci0JCQljdHh0LT5kZXB0aC0tOwotCQkgICAgfSBlbHNlIGlmIChlbnQtPmV0eXBlID09Ci0JCQkgICAgICAgWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkgewotCQkJY3R4dC0+ZGVwdGgrKzsKLQkJCXJldCA9IHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHlQcml2YXRlKGN0eHQtPm15RG9jLCBjdHh0LAotCQkJCSAgIGN0eHQtPnNheCwgdXNlcl9kYXRhLCBjdHh0LT5kZXB0aCwKLQkJCQkgICBlbnQtPlVSSSwgZW50LT5FeHRlcm5hbElELCAmbGlzdCk7Ci0JCQljdHh0LT5kZXB0aC0tOwotCQkgICAgfSBlbHNlIHsKLQkJCXJldCA9IFhNTF9FUlJfRU5USVRZX1BFX0lOVEVSTkFMOwotCQkJeG1sRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCi0JCQkJICAgICAiaW52YWxpZCBlbnRpdHkgdHlwZSBmb3VuZFxuIiwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgICBpZiAocmV0ID09IFhNTF9FUlJfRU5USVRZX0xPT1ApIHsKLQkJCXhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfRU5USVRZX0xPT1AsIE5VTEwpOwotCQkJcmV0dXJuOwotCQkgICAgfSBlbHNlIGlmICgocmV0ID09IFhNTF9FUlJfT0spICYmIChsaXN0ICE9IE5VTEwpKSB7Ci0JCQlpZiAoKChlbnQtPmV0eXBlID09IFhNTF9JTlRFUk5BTF9HRU5FUkFMX0VOVElUWSkgfHwKLQkJCSAoZW50LT5ldHlwZSA9PSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZKSkmJgotCQkJICAgIChlbnQtPmNoaWxkcmVuID09IE5VTEwpKSB7Ci0JCQkgICAgZW50LT5jaGlsZHJlbiA9IGxpc3Q7Ci0JCQkgICAgaWYgKGN0eHQtPnJlcGxhY2VFbnRpdGllcykgewotCQkJCS8qCi0JCQkJICogUHJ1bmUgaXQgZGlyZWN0bHkgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudAotCQkJCSAqIGV4Y2VwdCBmb3Igc2luZ2xlIHRleHQgbm9kZXMuCi0JCQkJICovCi0JCQkJaWYgKCgobGlzdC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSAmJgotCQkJCSAgICAgKGxpc3QtPm5leHQgPT0gTlVMTCkpIHx8Ci0JCQkJICAgIChjdHh0LT5wYXJzZU1vZGUgPT0gWE1MX1BBUlNFX1JFQURFUikpIHsKLQkJCQkgICAgbGlzdC0+cGFyZW50ID0gKHhtbE5vZGVQdHIpIGVudDsKLQkJCQkgICAgbGlzdCA9IE5VTEw7Ci0JCQkJICAgIGVudC0+b3duZXIgPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJICAgIGVudC0+b3duZXIgPSAwOwotCQkJCSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0JCQkJCWxpc3QtPnBhcmVudCA9ICh4bWxOb2RlUHRyKSBjdHh0LT5ub2RlOwotCQkJCQlsaXN0LT5kb2MgPSBjdHh0LT5teURvYzsKLQkJCQkJaWYgKGxpc3QtPm5leHQgPT0gTlVMTCkKLQkJCQkJICAgIGVudC0+bGFzdCA9IGxpc3Q7Ci0JCQkJCWxpc3QgPSBsaXN0LT5uZXh0OwotCQkJIAkgICAgfQotCQkJCSAgICBsaXN0ID0gZW50LT5jaGlsZHJlbjsKLSNpZmRlZiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQKLQkJCQkgICAgaWYgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkKLQkJCQkgICAgICB4bWxBZGRFbnRpdHlSZWZlcmVuY2UoZW50LCBsaXN0LCBOVUxMKTsKLSNlbmRpZiAvKiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQgKi8KLQkJCQl9Ci0JCQkgICAgfSBlbHNlIHsKLQkJCQllbnQtPm93bmVyID0gMTsKLQkJCQl3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0JCQkJICAgIGxpc3QtPnBhcmVudCA9ICh4bWxOb2RlUHRyKSBlbnQ7Ci0JCQkJICAgIGlmIChsaXN0LT5uZXh0ID09IE5VTEwpCi0JCQkJCWVudC0+bGFzdCA9IGxpc3Q7Ci0JCQkJICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9IGVsc2UgewotCQkJICAgIHhtbEZyZWVOb2RlTGlzdChsaXN0KTsKLQkJCSAgICBsaXN0ID0gTlVMTDsKLQkJCX0KLQkJICAgIH0gZWxzZSBpZiAoKHJldCAhPSBYTUxfRVJSX09LKSAmJgotCQkgICAgICAgICAgICAgICAocmV0ICE9IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpKSB7Ci0JCQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAotCQkJCSAiRW50aXR5ICclcycgZmFpbGVkIHRvIHBhcnNlXG4iLCBlbnQtPm5hbWUpOwotCQkgICAgfSBlbHNlIGlmIChsaXN0ICE9IE5VTEwpIHsKLQkJCXhtbEZyZWVOb2RlTGlzdChsaXN0KTsKLQkJCWxpc3QgPSBOVUxMOworCQkgICAgZW50LT5vd25lciA9IDE7CisJCSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CisJCQlsaXN0LT5wYXJlbnQgPSAoeG1sTm9kZVB0cikgZW50OworCQkJaWYgKGxpc3QtPm5leHQgPT0gTlVMTCkKKwkJCSAgICBlbnQtPmxhc3QgPSBsaXN0OworCQkJbGlzdCA9IGxpc3QtPm5leHQ7CiAJCSAgICB9CiAJCX0KLQkJZW50LT5jaGVja2VkID0gMTsKKwkgICAgfSBlbHNlIHsKKwkJeG1sRnJlZU5vZGVMaXN0KGxpc3QpOworCQlsaXN0ID0gTlVMTDsKIAkgICAgfQorCX0gZWxzZSBpZiAoKHJldCAhPSBYTUxfRVJSX09LKSAmJgorCQkgICAocmV0ICE9IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpKSB7CisJICAgIHhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5ERUNMQVJFRF9FTlRJVFksCisJCSAgICAgIkVudGl0eSAnJXMnIGZhaWxlZCB0byBwYXJzZVxuIiwgZW50LT5uYW1lKTsKKwl9IGVsc2UgaWYgKGxpc3QgIT0gTlVMTCkgeworCSAgICB4bWxGcmVlTm9kZUxpc3QobGlzdCk7CisJICAgIGxpc3QgPSBOVUxMOworCX0KKwlpZiAoZW50LT5jaGVja2VkID09IDApCisJICAgIGVudC0+Y2hlY2tlZCA9IDE7CisgICAgfSBlbHNlIGlmIChlbnQtPmNoZWNrZWQgIT0gMSkgeworCWN0eHQtPm5iZW50aXRpZXMgKz0gZW50LT5jaGVja2VkOworICAgIH0KIAotICAgICAgICAgICAgaWYgKGVudC0+Y2hpbGRyZW4gPT0gTlVMTCkgewotCQkvKgotCQkgKiBQcm9iYWJseSBydW5uaW5nIGluIFNBWCBtb2RlIGFuZCB0aGUgY2FsbGJhY2tzIGRvbid0Ci0JCSAqIGJ1aWxkIHRoZSBlbnRpdHkgY29udGVudC4gU28gdW5sZXNzIHdlIGFscmVhZHkgd2VudAotCQkgKiB0aG91Z2ggcGFyc2luZyBmb3IgZmlyc3QgY2hlY2tpbmcgZ28gdGhvdWdoIHRoZSBlbnRpdHkKLQkJICogY29udGVudCB0byBnZW5lcmF0ZSBjYWxsYmFja3MgYXNzb2NpYXRlZCB0byB0aGUgZW50aXR5Ci0JCSAqLwotCQlpZiAod2FzX2NoZWNrZWQgPT0gMSkgewotCQkgICAgdm9pZCAqdXNlcl9kYXRhOwotCQkgICAgLyoKLQkJICAgICAqIFRoaXMgaXMgYSBiaXQgaGFja2lzaCBidXQgdGhpcyBzZWVtcyB0aGUgYmVzdAotCQkgICAgICogd2F5IHRvIG1ha2Ugc3VyZSBib3RoIFNBWCBhbmQgRE9NIGVudGl0eSBzdXBwb3J0Ci0JCSAgICAgKiBiZWhhdmVzIG9rYXkuCi0JCSAgICAgKi8KLQkJICAgIGlmIChjdHh0LT51c2VyRGF0YSA9PSBjdHh0KQotCQkJdXNlcl9kYXRhID0gTlVMTDsKLQkJICAgIGVsc2UKLQkJCXVzZXJfZGF0YSA9IGN0eHQtPnVzZXJEYXRhOwotCi0JCSAgICBpZiAoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpIHsKLQkJCWN0eHQtPmRlcHRoKys7Ci0JCQlyZXQgPSB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlJbnRlcm5hbChjdHh0LAotCQkJCQkgICBlbnQtPmNvbnRlbnQsIHVzZXJfZGF0YSwgTlVMTCk7Ci0JCQljdHh0LT5kZXB0aC0tOwotCQkgICAgfSBlbHNlIGlmIChlbnQtPmV0eXBlID09Ci0JCQkgICAgICAgWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkgewotCQkJY3R4dC0+ZGVwdGgrKzsKLQkJCXJldCA9IHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHlQcml2YXRlKGN0eHQtPm15RG9jLCBjdHh0LAotCQkJCSAgIGN0eHQtPnNheCwgdXNlcl9kYXRhLCBjdHh0LT5kZXB0aCwKLQkJCQkgICBlbnQtPlVSSSwgZW50LT5FeHRlcm5hbElELCBOVUxMKTsKLQkJCWN0eHQtPmRlcHRoLS07Ci0JCSAgICB9IGVsc2UgewotCQkJcmV0ID0gWE1MX0VSUl9FTlRJVFlfUEVfSU5URVJOQUw7Ci0JCQl4bWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKLQkJCQkgICAgICJpbnZhbGlkIGVudGl0eSB0eXBlIGZvdW5kXG4iLCBOVUxMKTsKLQkJICAgIH0KLQkJICAgIGlmIChyZXQgPT0gWE1MX0VSUl9FTlRJVFlfTE9PUCkgewotCQkJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlfTE9PUCwgTlVMTCk7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQkJaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+cmVmZXJlbmNlICE9IE5VTEwpICYmCi0JCSAgICAoY3R4dC0+cmVwbGFjZUVudGl0aWVzID09IDApICYmICghY3R4dC0+ZGlzYWJsZVNBWCkpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBFbnRpdHkgcmVmZXJlbmNlIGNhbGxiYWNrIGNvbWVzIHNlY29uZCwgaXQncyBzb21ld2hhdAotCQkgICAgICogc3VwZXJmbHVvdXMgYnV0IGEgY29tcGF0aWJpbGl0eSB0byBoaXN0b3JpY2FsIGJlaGF2aW91cgotCQkgICAgICovCi0JCSAgICBjdHh0LT5zYXgtPnJlZmVyZW5jZShjdHh0LT51c2VyRGF0YSwgZW50LT5uYW1lKTsKLQkJfQotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+cmVmZXJlbmNlICE9IE5VTEwpICYmCi0JICAgICAgICAoY3R4dC0+cmVwbGFjZUVudGl0aWVzID09IDApICYmICghY3R4dC0+ZGlzYWJsZVNBWCkpIHsKLQkJLyoKLQkJICogQ3JlYXRlIGEgbm9kZS4KLQkJICovCi0JCWN0eHQtPnNheC0+cmVmZXJlbmNlKGN0eHQtPnVzZXJEYXRhLCBlbnQtPm5hbWUpOwotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgaWYgKChjdHh0LT5yZXBsYWNlRW50aXRpZXMpIHx8IChlbnQtPmNoaWxkcmVuID09IE5VTEwpKSAgewotCQkvKgotCQkgKiBUaGVyZSBpcyBhIHByb2JsZW0gb24gdGhlIGhhbmRsaW5nIG9mIF9wcml2YXRlIGZvciBlbnRpdGllcwotCQkgKiAoYnVnIDE1NTgxNik6IFNob3VsZCB3ZSBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWVsZCBmcm9tCi0JCSAqIHRoZSBlbnRpdHkgKHBvc3NpYmx5IG92ZXJ3cml0aW5nIHNvbWUgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyCi0JCSAqIHdoZW4gYSBjb3B5IGlzIGNyZWF0ZWQpLCBzaG91bGQgd2UgbGVhdmUgaXQgYWxvbmUsIG9yIHNob3VsZAotCQkgKiB3ZSB0cnkgdG8gdGFrZSBjYXJlIG9mIGRpZmZlcmVudCBzaXR1YXRpb25zPyAgVGhlIHByb2JsZW0KLQkJICogaXMgZXhhY2VyYmF0ZWQgYnkgdGhlIHVzYWdlIG9mIHRoaXMgZmllbGQgYnkgdGhlIHhtbFJlYWRlci4KLQkJICogVG8gZml4IHRoaXMgYnVnLCB3ZSBsb29rIGF0IF9wcml2YXRlIG9uIHRoZSBjcmVhdGVkIG5vZGUKLQkJICogYW5kLCBpZiBpdCdzIE5VTEwsIHdlIGNvcHkgaW4gd2hhdGV2ZXIgd2FzIGluIHRoZSBlbnRpdHkuCi0JCSAqIElmIGl0J3Mgbm90IE5VTEwgd2UgbGVhdmUgaXQgYWxvbmUuICBUaGlzIGlzIHNvbWV3aGF0IG9mIGEKLQkJICogaGFjayAtIG1heWJlIHdlIHNob3VsZCBoYXZlIGZ1cnRoZXIgdGVzdHMgdG8gZGV0ZXJtaW5lCi0JCSAqIHdoYXQgdG8gZG8uCi0JCSAqLwotCQlpZiAoKGN0eHQtPm5vZGUgIT0gTlVMTCkgJiYgKGVudC0+Y2hpbGRyZW4gIT0gTlVMTCkpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBTZWVtcyB3ZSBhcmUgZ2VuZXJhdGluZyB0aGUgRE9NIGNvbnRlbnQsIGRvCi0JCSAgICAgKiBhIHNpbXBsZSB0cmVlIGNvcHkgZm9yIGFsbCByZWZlcmVuY2VzIGV4Y2VwdCB0aGUgZmlyc3QKLQkJICAgICAqIEluIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGxpc3QgY29udGFpbnMgdGhlIHJlcGxhY2VtZW50LgotCQkgICAgICogcHJvZ3Jlc3NpdmUgPT0gMiBtZWFucyB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRoZSBSZWFkZXIKLQkJICAgICAqIGFuZCBzaW5jZSBub2RlcyBhcmUgZGlzY2FyZGVkIHdlIG11c3QgY29weSBhbGwgdGhlIHRpbWUuCi0JCSAgICAgKi8KLQkJICAgIGlmICgoKGxpc3QgPT0gTlVMTCkgJiYgKGVudC0+b3duZXIgPT0gMCkpIHx8Ci0JCSAgICAgICAgKGN0eHQtPnBhcnNlTW9kZSA9PSBYTUxfUEFSU0VfUkVBREVSKSkgewotCQkJeG1sTm9kZVB0ciBudyA9IE5VTEwsIGN1ciwgZmlyc3RDaGlsZCA9IE5VTEw7Ci0KLQkJCS8qCi0JCQkgKiB3aGVuIG9wZXJhdGluZyBvbiBhIHJlYWRlciwgdGhlIGVudGl0aWVzIGRlZmluaXRpb25zCi0JCQkgKiBhcmUgYWx3YXlzIG93bmluZyB0aGUgZW50aXRpZXMgc3VidHJlZS4KLQkJCWlmIChjdHh0LT5wYXJzZU1vZGUgPT0gWE1MX1BBUlNFX1JFQURFUikKLQkJCSAgICBlbnQtPm93bmVyID0gMTsKLQkJCSAqLwotCi0JCQljdXIgPSBlbnQtPmNoaWxkcmVuOwotCQkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0JCQkgICAgbncgPSB4bWxEb2NDb3B5Tm9kZShjdXIsIGN0eHQtPm15RG9jLCAxKTsKLQkJCSAgICBpZiAobncgIT0gTlVMTCkgewotCQkJCWlmIChudy0+X3ByaXZhdGUgPT0gTlVMTCkKLQkJCQkgICAgbnctPl9wcml2YXRlID0gY3VyLT5fcHJpdmF0ZTsKLQkJCQlpZiAoZmlyc3RDaGlsZCA9PSBOVUxMKXsKLQkJCQkgICAgZmlyc3RDaGlsZCA9IG53OwotCQkJCX0KLQkJCQludyA9IHhtbEFkZENoaWxkKGN0eHQtPm5vZGUsIG53KTsKLQkJCSAgICB9Ci0JCQkgICAgaWYgKGN1ciA9PSBlbnQtPmxhc3QpIHsKLQkJCSAgICAgICAgLyoKLQkJCQkgKiBuZWVkZWQgdG8gZGV0ZWN0IHNvbWUgc3RyYW5nZSBlbXB0eQotCQkJCSAqIG5vZGUgY2FzZXMgaW4gdGhlIHJlYWRlciB0ZXN0cwotCQkJCSAqLwotCQkJICAgICAgICBpZiAoKGN0eHQtPnBhcnNlTW9kZSA9PSBYTUxfUEFSU0VfUkVBREVSKSAmJgotCQkJCSAgICAobncgIT0gTlVMTCkgJiYKLQkJCQkgICAgKG53LT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmCi0JCQkJICAgIChudy0+Y2hpbGRyZW4gPT0gTlVMTCkpCi0JCQkJICAgIG53LT5leHRyYSA9IDE7Ci0KLQkJCQlicmVhazsKLQkJCSAgICB9Ci0JCQkgICAgY3VyID0gY3VyLT5uZXh0OwotCQkJfQotI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAotCQkJaWYgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkJCQkgICAgICAKLQkJCSAgeG1sQWRkRW50aXR5UmVmZXJlbmNlKGVudCwgZmlyc3RDaGlsZCwgbncpOwotI2VuZGlmIC8qIExJQlhNTF9MRUdBQ1lfRU5BQkxFRCAqLwotCQkgICAgfSBlbHNlIGlmIChsaXN0ID09IE5VTEwpIHsKLQkJCXhtbE5vZGVQdHIgbncgPSBOVUxMLCBjdXIsIG5leHQsIGxhc3QsCi0JCQkgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBOVUxMOwotCQkJLyoKLQkJCSAqIENvcHkgdGhlIGVudGl0eSBjaGlsZCBsaXN0IGFuZCBtYWtlIGl0IHRoZSBuZXcKLQkJCSAqIGVudGl0eSBjaGlsZCBsaXN0LiBUaGUgZ29hbCBpcyB0byBtYWtlIHN1cmUgYW55Ci0JCQkgKiBJRCBvciBSRUYgcmVmZXJlbmNlZCB3aWxsIGJlIHRoZSBvbmUgZnJvbSB0aGUKLQkJCSAqIGRvY3VtZW50IGNvbnRlbnQgYW5kIG5vdCB0aGUgZW50aXR5IGNvcHkuCi0JCQkgKi8KLQkJCWN1ciA9IGVudC0+Y2hpbGRyZW47Ci0JCQllbnQtPmNoaWxkcmVuID0gTlVMTDsKLQkJCWxhc3QgPSBlbnQtPmxhc3Q7Ci0JCQllbnQtPmxhc3QgPSBOVUxMOwotCQkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0JCQkgICAgbmV4dCA9IGN1ci0+bmV4dDsKLQkJCSAgICBjdXItPm5leHQgPSBOVUxMOwotCQkJICAgIGN1ci0+cGFyZW50ID0gTlVMTDsKLQkJCSAgICBudyA9IHhtbERvY0NvcHlOb2RlKGN1ciwgY3R4dC0+bXlEb2MsIDEpOwotCQkJICAgIGlmIChudyAhPSBOVUxMKSB7Ci0JCQkJaWYgKG53LT5fcHJpdmF0ZSA9PSBOVUxMKQotCQkJCSAgICBudy0+X3ByaXZhdGUgPSBjdXItPl9wcml2YXRlOwotCQkJCWlmIChmaXJzdENoaWxkID09IE5VTEwpewotCQkJCSAgICBmaXJzdENoaWxkID0gY3VyOwotCQkJCX0KLQkJCQl4bWxBZGRDaGlsZCgoeG1sTm9kZVB0cikgZW50LCBudyk7Ci0JCQkJeG1sQWRkQ2hpbGQoY3R4dC0+bm9kZSwgY3VyKTsKLQkJCSAgICB9Ci0JCQkgICAgaWYgKGN1ciA9PSBsYXN0KQotCQkJCWJyZWFrOwotCQkJICAgIGN1ciA9IG5leHQ7Ci0JCQl9Ci0JCQllbnQtPm93bmVyID0gMTsKLSNpZmRlZiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQKLQkJCWlmIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFkpCQkJICAgICAgCi0JCQkgIHhtbEFkZEVudGl0eVJlZmVyZW5jZShlbnQsIGZpcnN0Q2hpbGQsIG53KTsKLSNlbmRpZiAvKiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQgKi8KLQkJICAgIH0gZWxzZSB7Ci0JCSAgICAgICAgY29uc3QgeG1sQ2hhciAqbmJrdGV4dDsKLQotCQkJLyoKLQkJCSAqIHRoZSBuYW1lIGNoYW5nZSBpcyB0byBhdm9pZCBjb2FsZXNjaW5nIG9mIHRoZQotCQkJICogbm9kZSB3aXRoIGEgcG9zc2libGUgcHJldmlvdXMgdGV4dCBvbmUgd2hpY2gKLQkJCSAqIHdvdWxkIG1ha2UgZW50LT5jaGlsZHJlbiBhIGRhbmdsaW5nIHBvaW50ZXIKLQkJCSAqLwotCQkJbmJrdGV4dCA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgQkFEX0NBU1QgIm5ia3RleHQiLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgLTEpOwotCQkJaWYgKGVudC0+Y2hpbGRyZW4tPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkKLQkJCSAgICBlbnQtPmNoaWxkcmVuLT5uYW1lID0gbmJrdGV4dDsKLQkJCWlmICgoZW50LT5sYXN0ICE9IGVudC0+Y2hpbGRyZW4pICYmCi0JCQkgICAgKGVudC0+bGFzdC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSkKLQkJCSAgICBlbnQtPmxhc3QtPm5hbWUgPSBuYmt0ZXh0OwotCQkJeG1sQWRkQ2hpbGRMaXN0KGN0eHQtPm5vZGUsIGVudC0+Y2hpbGRyZW4pOwotCQkgICAgfQotCi0JCSAgICAvKgotCQkgICAgICogVGhpcyBpcyB0byBhdm9pZCBhIG5hc3R5IHNpZGUgZWZmZWN0LCBzZWUKLQkJICAgICAqIGNoYXJhY3RlcnMoKSBpbiBTQVguYwotCQkgICAgICovCi0JCSAgICBjdHh0LT5ub2RlbWVtID0gMDsKLQkJICAgIGN0eHQtPm5vZGVsZW4gPSAwOwotCQkgICAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB2YWwgPSBlbnQtPmNvbnRlbnQ7Ci0JICAgIGlmICh2YWwgPT0gTlVMTCkgcmV0dXJuOworICAgIC8qCisgICAgICogTm93IHRoYXQgdGhlIGVudGl0eSBjb250ZW50IGhhcyBiZWVuIGdhdGhlcmVkCisgICAgICogcHJvdmlkZSBpdCB0byB0aGUgYXBwbGljYXRpb24sIHRoaXMgY2FuIHRha2UgZGlmZmVyZW50IGZvcm1zIGJhc2VkCisgICAgICogb24gdGhlIHBhcnNpbmcgbW9kZXMuCisgICAgICovCisgICAgaWYgKGVudC0+Y2hpbGRyZW4gPT0gTlVMTCkgeworCS8qCisJICogUHJvYmFibHkgcnVubmluZyBpbiBTQVggbW9kZSBhbmQgdGhlIGNhbGxiYWNrcyBkb24ndAorCSAqIGJ1aWxkIHRoZSBlbnRpdHkgY29udGVudC4gU28gdW5sZXNzIHdlIGFscmVhZHkgd2VudAorCSAqIHRob3VnaCBwYXJzaW5nIGZvciBmaXJzdCBjaGVja2luZyBnbyB0aG91Z2ggdGhlIGVudGl0eQorCSAqIGNvbnRlbnQgdG8gZ2VuZXJhdGUgY2FsbGJhY2tzIGFzc29jaWF0ZWQgdG8gdGhlIGVudGl0eQorCSAqLworCWlmICh3YXNfY2hlY2tlZCAhPSAwKSB7CisJICAgIHZvaWQgKnVzZXJfZGF0YTsKIAkgICAgLyoKLQkgICAgICogaW5saW5lIHRoZSBlbnRpdHkuCisJICAgICAqIFRoaXMgaXMgYSBiaXQgaGFja2lzaCBidXQgdGhpcyBzZWVtcyB0aGUgYmVzdAorCSAgICAgKiB3YXkgdG8gbWFrZSBzdXJlIGJvdGggU0FYIGFuZCBET00gZW50aXR5IHN1cHBvcnQKKwkgICAgICogYmVoYXZlcyBva2F5LgogCSAgICAgKi8KLQkgICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYgKGN0eHQtPnNheC0+Y2hhcmFjdGVycyAhPSBOVUxMKSAmJgotCQkoIWN0eHQtPmRpc2FibGVTQVgpKQotCQljdHh0LT5zYXgtPmNoYXJhY3RlcnMoY3R4dC0+dXNlckRhdGEsIHZhbCwgeG1sU3RybGVuKHZhbCkpOworCSAgICBpZiAoY3R4dC0+dXNlckRhdGEgPT0gY3R4dCkKKwkJdXNlcl9kYXRhID0gTlVMTDsKKwkgICAgZWxzZQorCQl1c2VyX2RhdGEgPSBjdHh0LT51c2VyRGF0YTsKKworCSAgICBpZiAoZW50LT5ldHlwZSA9PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpIHsKKwkJY3R4dC0+ZGVwdGgrKzsKKwkJcmV0ID0geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5SW50ZXJuYWwoY3R4dCwKKwkJCQkgICBlbnQtPmNvbnRlbnQsIHVzZXJfZGF0YSwgTlVMTCk7CisJCWN0eHQtPmRlcHRoLS07CisJICAgIH0gZWxzZSBpZiAoZW50LT5ldHlwZSA9PQorCQkgICAgICAgWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkgeworCQljdHh0LT5kZXB0aCsrOworCQlyZXQgPSB4bWxQYXJzZUV4dGVybmFsRW50aXR5UHJpdmF0ZShjdHh0LT5teURvYywgY3R4dCwKKwkJCSAgIGN0eHQtPnNheCwgdXNlcl9kYXRhLCBjdHh0LT5kZXB0aCwKKwkJCSAgIGVudC0+VVJJLCBlbnQtPkV4dGVybmFsSUQsIE5VTEwpOworCQljdHh0LT5kZXB0aC0tOworCSAgICB9IGVsc2UgeworCQlyZXQgPSBYTUxfRVJSX0VOVElUWV9QRV9JTlRFUk5BTDsKKwkJeG1sRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfSU5URVJOQUxfRVJST1IsCisJCQkgICAgICJpbnZhbGlkIGVudGl0eSB0eXBlIGZvdW5kXG4iLCBOVUxMKTsKKwkgICAgfQorCSAgICBpZiAocmV0ID09IFhNTF9FUlJfRU5USVRZX0xPT1ApIHsKKwkJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlfTE9PUCwgTlVMTCk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKwlpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoY3R4dC0+c2F4LT5yZWZlcmVuY2UgIT0gTlVMTCkgJiYKKwkgICAgKGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9PSAwKSAmJiAoIWN0eHQtPmRpc2FibGVTQVgpKSB7CisJICAgIC8qCisJICAgICAqIEVudGl0eSByZWZlcmVuY2UgY2FsbGJhY2sgY29tZXMgc2Vjb25kLCBpdCdzIHNvbWV3aGF0CisJICAgICAqIHN1cGVyZmx1b3VzIGJ1dCBhIGNvbXBhdGliaWxpdHkgdG8gaGlzdG9yaWNhbCBiZWhhdmlvdXIKKwkgICAgICovCisJICAgIGN0eHQtPnNheC0+cmVmZXJlbmNlKGN0eHQtPnVzZXJEYXRhLCBlbnQtPm5hbWUpOworCX0KKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB3ZSBkaWRuJ3QgZ2V0IGFueSBjaGlsZHJlbiBmb3IgdGhlIGVudGl0eSBiZWluZyBidWlsdAorICAgICAqLworICAgIGlmICgoY3R4dC0+c2F4ICE9IE5VTEwpICYmIChjdHh0LT5zYXgtPnJlZmVyZW5jZSAhPSBOVUxMKSAmJgorCShjdHh0LT5yZXBsYWNlRW50aXRpZXMgPT0gMCkgJiYgKCFjdHh0LT5kaXNhYmxlU0FYKSkgeworCS8qCisJICogQ3JlYXRlIGEgbm9kZS4KKwkgKi8KKwljdHh0LT5zYXgtPnJlZmVyZW5jZShjdHh0LT51c2VyRGF0YSwgZW50LT5uYW1lKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKChjdHh0LT5yZXBsYWNlRW50aXRpZXMpIHx8IChlbnQtPmNoaWxkcmVuID09IE5VTEwpKSAgeworCS8qCisJICogVGhlcmUgaXMgYSBwcm9ibGVtIG9uIHRoZSBoYW5kbGluZyBvZiBfcHJpdmF0ZSBmb3IgZW50aXRpZXMKKwkgKiAoYnVnIDE1NTgxNik6IFNob3VsZCB3ZSBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWVsZCBmcm9tCisJICogdGhlIGVudGl0eSAocG9zc2libHkgb3ZlcndyaXRpbmcgc29tZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIKKwkgKiB3aGVuIGEgY29weSBpcyBjcmVhdGVkKSwgc2hvdWxkIHdlIGxlYXZlIGl0IGFsb25lLCBvciBzaG91bGQKKwkgKiB3ZSB0cnkgdG8gdGFrZSBjYXJlIG9mIGRpZmZlcmVudCBzaXR1YXRpb25zPyAgVGhlIHByb2JsZW0KKwkgKiBpcyBleGFjZXJiYXRlZCBieSB0aGUgdXNhZ2Ugb2YgdGhpcyBmaWVsZCBieSB0aGUgeG1sUmVhZGVyLgorCSAqIFRvIGZpeCB0aGlzIGJ1Zywgd2UgbG9vayBhdCBfcHJpdmF0ZSBvbiB0aGUgY3JlYXRlZCBub2RlCisJICogYW5kLCBpZiBpdCdzIE5VTEwsIHdlIGNvcHkgaW4gd2hhdGV2ZXIgd2FzIGluIHRoZSBlbnRpdHkuCisJICogSWYgaXQncyBub3QgTlVMTCB3ZSBsZWF2ZSBpdCBhbG9uZS4gIFRoaXMgaXMgc29tZXdoYXQgb2YgYQorCSAqIGhhY2sgLSBtYXliZSB3ZSBzaG91bGQgaGF2ZSBmdXJ0aGVyIHRlc3RzIHRvIGRldGVybWluZQorCSAqIHdoYXQgdG8gZG8uCisJICovCisJaWYgKChjdHh0LT5ub2RlICE9IE5VTEwpICYmIChlbnQtPmNoaWxkcmVuICE9IE5VTEwpKSB7CisJICAgIC8qCisJICAgICAqIFNlZW1zIHdlIGFyZSBnZW5lcmF0aW5nIHRoZSBET00gY29udGVudCwgZG8KKwkgICAgICogYSBzaW1wbGUgdHJlZSBjb3B5IGZvciBhbGwgcmVmZXJlbmNlcyBleGNlcHQgdGhlIGZpcnN0CisJICAgICAqIEluIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGxpc3QgY29udGFpbnMgdGhlIHJlcGxhY2VtZW50LgorCSAgICAgKiBwcm9ncmVzc2l2ZSA9PSAyIG1lYW5zIHdlIGFyZSBvcGVyYXRpbmcgb24gdGhlIFJlYWRlcgorCSAgICAgKiBhbmQgc2luY2Ugbm9kZXMgYXJlIGRpc2NhcmRlZCB3ZSBtdXN0IGNvcHkgYWxsIHRoZSB0aW1lLgorCSAgICAgKi8KKwkgICAgaWYgKCgobGlzdCA9PSBOVUxMKSAmJiAoZW50LT5vd25lciA9PSAwKSkgfHwKKwkJKGN0eHQtPnBhcnNlTW9kZSA9PSBYTUxfUEFSU0VfUkVBREVSKSkgeworCQl4bWxOb2RlUHRyIG53ID0gTlVMTCwgY3VyLCBmaXJzdENoaWxkID0gTlVMTDsKKworCQkvKgorCQkgKiB3aGVuIG9wZXJhdGluZyBvbiBhIHJlYWRlciwgdGhlIGVudGl0aWVzIGRlZmluaXRpb25zCisJCSAqIGFyZSBhbHdheXMgb3duaW5nIHRoZSBlbnRpdGllcyBzdWJ0cmVlLgorCQlpZiAoY3R4dC0+cGFyc2VNb2RlID09IFhNTF9QQVJTRV9SRUFERVIpCisJCSAgICBlbnQtPm93bmVyID0gMTsKKwkJICovCisKKwkJY3VyID0gZW50LT5jaGlsZHJlbjsKKwkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisJCSAgICBudyA9IHhtbERvY0NvcHlOb2RlKGN1ciwgY3R4dC0+bXlEb2MsIDEpOworCQkgICAgaWYgKG53ICE9IE5VTEwpIHsKKwkJCWlmIChudy0+X3ByaXZhdGUgPT0gTlVMTCkKKwkJCSAgICBudy0+X3ByaXZhdGUgPSBjdXItPl9wcml2YXRlOworCQkJaWYgKGZpcnN0Q2hpbGQgPT0gTlVMTCl7CisJCQkgICAgZmlyc3RDaGlsZCA9IG53OworCQkJfQorCQkJbncgPSB4bWxBZGRDaGlsZChjdHh0LT5ub2RlLCBudyk7CisJCSAgICB9CisJCSAgICBpZiAoY3VyID09IGVudC0+bGFzdCkgeworCQkJLyoKKwkJCSAqIG5lZWRlZCB0byBkZXRlY3Qgc29tZSBzdHJhbmdlIGVtcHR5CisJCQkgKiBub2RlIGNhc2VzIGluIHRoZSByZWFkZXIgdGVzdHMKKwkJCSAqLworCQkJaWYgKChjdHh0LT5wYXJzZU1vZGUgPT0gWE1MX1BBUlNFX1JFQURFUikgJiYKKwkJCSAgICAobncgIT0gTlVMTCkgJiYKKwkJCSAgICAobnctPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgJiYKKwkJCSAgICAobnctPmNoaWxkcmVuID09IE5VTEwpKQorCQkJICAgIG53LT5leHRyYSA9IDE7CisKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgY3VyID0gY3VyLT5uZXh0OworCQl9CisjaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECisJCWlmIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFkpCisJCSAgeG1sQWRkRW50aXR5UmVmZXJlbmNlKGVudCwgZmlyc3RDaGlsZCwgbncpOworI2VuZGlmIC8qIExJQlhNTF9MRUdBQ1lfRU5BQkxFRCAqLworCSAgICB9IGVsc2UgaWYgKGxpc3QgPT0gTlVMTCkgeworCQl4bWxOb2RlUHRyIG53ID0gTlVMTCwgY3VyLCBuZXh0LCBsYXN0LAorCQkJICAgZmlyc3RDaGlsZCA9IE5VTEw7CisJCS8qCisJCSAqIENvcHkgdGhlIGVudGl0eSBjaGlsZCBsaXN0IGFuZCBtYWtlIGl0IHRoZSBuZXcKKwkJICogZW50aXR5IGNoaWxkIGxpc3QuIFRoZSBnb2FsIGlzIHRvIG1ha2Ugc3VyZSBhbnkKKwkJICogSUQgb3IgUkVGIHJlZmVyZW5jZWQgd2lsbCBiZSB0aGUgb25lIGZyb20gdGhlCisJCSAqIGRvY3VtZW50IGNvbnRlbnQgYW5kIG5vdCB0aGUgZW50aXR5IGNvcHkuCisJCSAqLworCQljdXIgPSBlbnQtPmNoaWxkcmVuOworCQllbnQtPmNoaWxkcmVuID0gTlVMTDsKKwkJbGFzdCA9IGVudC0+bGFzdDsKKwkJZW50LT5sYXN0ID0gTlVMTDsKKwkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisJCSAgICBuZXh0ID0gY3VyLT5uZXh0OworCQkgICAgY3VyLT5uZXh0ID0gTlVMTDsKKwkJICAgIGN1ci0+cGFyZW50ID0gTlVMTDsKKwkJICAgIG53ID0geG1sRG9jQ29weU5vZGUoY3VyLCBjdHh0LT5teURvYywgMSk7CisJCSAgICBpZiAobncgIT0gTlVMTCkgeworCQkJaWYgKG53LT5fcHJpdmF0ZSA9PSBOVUxMKQorCQkJICAgIG53LT5fcHJpdmF0ZSA9IGN1ci0+X3ByaXZhdGU7CisJCQlpZiAoZmlyc3RDaGlsZCA9PSBOVUxMKXsKKwkJCSAgICBmaXJzdENoaWxkID0gY3VyOworCQkJfQorCQkJeG1sQWRkQ2hpbGQoKHhtbE5vZGVQdHIpIGVudCwgbncpOworCQkJeG1sQWRkQ2hpbGQoY3R4dC0+bm9kZSwgY3VyKTsKKwkJICAgIH0KKwkJICAgIGlmIChjdXIgPT0gbGFzdCkKKwkJCWJyZWFrOworCQkgICAgY3VyID0gbmV4dDsKKwkJfQorCQlpZiAoZW50LT5vd25lciA9PSAwKQorCQkgICAgZW50LT5vd25lciA9IDE7CisjaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECisJCWlmIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFkpCisJCSAgeG1sQWRkRW50aXR5UmVmZXJlbmNlKGVudCwgZmlyc3RDaGlsZCwgbncpOworI2VuZGlmIC8qIExJQlhNTF9MRUdBQ1lfRU5BQkxFRCAqLworCSAgICB9IGVsc2UgeworCQljb25zdCB4bWxDaGFyICpuYmt0ZXh0OworCisJCS8qCisJCSAqIHRoZSBuYW1lIGNoYW5nZSBpcyB0byBhdm9pZCBjb2FsZXNjaW5nIG9mIHRoZQorCQkgKiBub2RlIHdpdGggYSBwb3NzaWJsZSBwcmV2aW91cyB0ZXh0IG9uZSB3aGljaAorCQkgKiB3b3VsZCBtYWtlIGVudC0+Y2hpbGRyZW4gYSBkYW5nbGluZyBwb2ludGVyCisJCSAqLworCQluYmt0ZXh0ID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBCQURfQ0FTVCAibmJrdGV4dCIsCisJCQkJCS0xKTsKKwkJaWYgKGVudC0+Y2hpbGRyZW4tPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkKKwkJICAgIGVudC0+Y2hpbGRyZW4tPm5hbWUgPSBuYmt0ZXh0OworCQlpZiAoKGVudC0+bGFzdCAhPSBlbnQtPmNoaWxkcmVuKSAmJgorCQkgICAgKGVudC0+bGFzdC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSkKKwkJICAgIGVudC0+bGFzdC0+bmFtZSA9IG5ia3RleHQ7CisJCXhtbEFkZENoaWxkTGlzdChjdHh0LT5ub2RlLCBlbnQtPmNoaWxkcmVuKTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFRoaXMgaXMgdG8gYXZvaWQgYSBuYXN0eSBzaWRlIGVmZmVjdCwgc2VlCisJICAgICAqIGNoYXJhY3RlcnMoKSBpbiBTQVguYworCSAgICAgKi8KKwkgICAgY3R4dC0+bm9kZW1lbSA9IDA7CisJICAgIGN0eHQtPm5vZGVsZW4gPSAwOworCSAgICByZXR1cm47CiAJfQogICAgIH0KIH0KQEAgLTY0MDUsMTMyICs3MDI4LDE0NiBAQAogICAgIHhtbEVudGl0eVB0ciBlbnQgPSBOVUxMOwogCiAgICAgR1JPVzsKLSAgICAKLSAgICBpZiAoUkFXID09ICcmJykgewotICAgICAgICBORVhUOwotICAgICAgICBuYW1lID0geG1sUGFyc2VOYW1lKGN0eHQpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9OQU1FX1JFUVVJUkVELAotCQkJICAgInhtbFBhcnNlRW50aXR5UmVmOiBubyBuYW1lXG4iKTsKLQl9IGVsc2UgewotCSAgICBpZiAoUkFXID09ICc7JykgewotCSAgICAgICAgTkVYVDsKLQkJLyoKLQkJICogQXNrIGZpcnN0IFNBWCBmb3IgZW50aXR5IHJlc29sdXRpb24sIG90aGVyd2lzZSB0cnkgdGhlCi0JCSAqIHByZWRlZmluZWQgc2V0LgotCQkgKi8KLQkJaWYgKGN0eHQtPnNheCAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoY3R4dC0+c2F4LT5nZXRFbnRpdHkgIT0gTlVMTCkKLQkJCWVudCA9IGN0eHQtPnNheC0+Z2V0RW50aXR5KGN0eHQtPnVzZXJEYXRhLCBuYW1lKTsKLQkJICAgIGlmICgoY3R4dC0+d2VsbEZvcm1lZCA9PSAxICkgJiYgKGVudCA9PSBOVUxMKSkKLQkJICAgICAgICBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KG5hbWUpOwotCQkgICAgaWYgKChjdHh0LT53ZWxsRm9ybWVkID09IDEgKSAmJiAoZW50ID09IE5VTEwpICYmCi0JCQkoY3R4dC0+dXNlckRhdGE9PWN0eHQpKSB7Ci0JCQllbnQgPSB4bWxTQVgyR2V0RW50aXR5KGN0eHQsIG5hbWUpOwotCQkgICAgfQotCQl9Ci0JCS8qCi0JCSAqIFsgV0ZDOiBFbnRpdHkgRGVjbGFyZWQgXQotCQkgKiBJbiBhIGRvY3VtZW50IHdpdGhvdXQgYW55IERURCwgYSBkb2N1bWVudCB3aXRoIG9ubHkgYW4KLQkJICogaW50ZXJuYWwgRFREIHN1YnNldCB3aGljaCBjb250YWlucyBubyBwYXJhbWV0ZXIgZW50aXR5Ci0JCSAqIHJlZmVyZW5jZXMsIG9yIGEgZG9jdW1lbnQgd2l0aCAic3RhbmRhbG9uZT0neWVzJyIsIHRoZQotCQkgKiBOYW1lIGdpdmVuIGluIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG11c3QgbWF0Y2ggdGhhdCBpbiBhbgotCQkgKiBlbnRpdHkgZGVjbGFyYXRpb24sIGV4Y2VwdCB0aGF0IHdlbGwtZm9ybWVkIGRvY3VtZW50cwotCQkgKiBuZWVkIG5vdCBkZWNsYXJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGVudGl0aWVzOiBhbXAsIGx0LAotCQkgKiBndCwgYXBvcywgcXVvdC4KLQkJICogVGhlIGRlY2xhcmF0aW9uIG9mIGEgcGFyYW1ldGVyIGVudGl0eSBtdXN0IHByZWNlZGUgYW55Ci0JCSAqIHJlZmVyZW5jZSB0byBpdC4KLQkJICogU2ltaWxhcmx5LCB0aGUgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmFsIGVudGl0eSBtdXN0Ci0JCSAqIHByZWNlZGUgYW55IHJlZmVyZW5jZSB0byBpdCB3aGljaCBhcHBlYXJzIGluIGEgZGVmYXVsdAotCQkgKiB2YWx1ZSBpbiBhbiBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbi4gTm90ZSB0aGF0IGlmCi0JCSAqIGVudGl0aWVzIGFyZSBkZWNsYXJlZCBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0IG9yIGluCi0JCSAqIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcywgYSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3IKLQkJICogaXMgbm90IG9ibGlnYXRlZCB0byByZWFkIGFuZCBwcm9jZXNzIHRoZWlyIGRlY2xhcmF0aW9uczsKLQkJICogZm9yIHN1Y2ggZG9jdW1lbnRzLCB0aGUgcnVsZSB0aGF0IGFuIGVudGl0eSBtdXN0IGJlCi0JCSAqIGRlY2xhcmVkIGlzIGEgd2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnQgb25seSBpZgotCQkgKiBzdGFuZGFsb25lPSd5ZXMnLiAKLQkJICovCi0JCWlmIChlbnQgPT0gTlVMTCkgewotCQkgICAgaWYgKChjdHh0LT5zdGFuZGFsb25lID09IDEpIHx8Ci0JCSAgICAgICAgKChjdHh0LT5oYXNFeHRlcm5hbFN1YnNldCA9PSAwKSAmJgotCQkJIChjdHh0LT5oYXNQRXJlZnMgPT0gMCkpKSB7Ci0JCQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAotCQkJCSAiRW50aXR5ICclcycgbm90IGRlZmluZWRcbiIsIG5hbWUpOwotCQkgICAgfSBlbHNlIHsKLQkJICAgICAgICB4bWxFcnJNc2dTdHIoY3R4dCwgWE1MX1dBUl9VTkRFQ0xBUkVEX0VOVElUWSwKLQkJCQkgIkVudGl0eSAnJXMnIG5vdCBkZWZpbmVkXG4iLCBuYW1lKTsKLQkJCWlmICgoY3R4dC0+aW5TdWJzZXQgPT0gMCkgJiYKLQkJICAgICAgICAgICAgKGN0eHQtPnNheCAhPSBOVUxMKSAmJgotCQkgICAgICAgICAgICAoY3R4dC0+c2F4LT5yZWZlcmVuY2UgIT0gTlVMTCkpIHsKLQkJCSAgICBjdHh0LT5zYXgtPnJlZmVyZW5jZShjdHh0LT51c2VyRGF0YSwgbmFtZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBjdHh0LT52YWxpZCA9IDA7Ci0JCX0KIAotCQkvKgotCQkgKiBbIFdGQzogUGFyc2VkIEVudGl0eSBdCi0JCSAqIEFuIGVudGl0eSByZWZlcmVuY2UgbXVzdCBub3QgY29udGFpbiB0aGUgbmFtZSBvZiBhbgotCQkgKiB1bnBhcnNlZCBlbnRpdHkKLQkJICovCi0JCWVsc2UgaWYgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZKSB7Ci0JCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOUEFSU0VEX0VOVElUWSwKLQkJCSAgICAgIkVudGl0eSByZWZlcmVuY2UgdG8gdW5wYXJzZWQgZW50aXR5ICVzXG4iLCBuYW1lKTsKLQkJfQorICAgIGlmIChSQVcgIT0gJyYnKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgTkVYVDsKKyAgICBuYW1lID0geG1sUGFyc2VOYW1lKGN0eHQpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKwl4bWxGYXRhbEVyck1zZyhjdHh0LCBYTUxfRVJSX05BTUVfUkVRVUlSRUQsCisJCSAgICAgICAieG1sUGFyc2VFbnRpdHlSZWY6IG5vIG5hbWVcbiIpOworICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmIChSQVcgIT0gJzsnKSB7CisJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlSRUZfU0VNSUNPTF9NSVNTSU5HLCBOVUxMKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIE5FWFQ7CiAKLQkJLyoKLQkJICogWyBXRkM6IE5vIEV4dGVybmFsIEVudGl0eSBSZWZlcmVuY2VzIF0KLQkJICogQXR0cmlidXRlIHZhbHVlcyBjYW5ub3QgY29udGFpbiBkaXJlY3Qgb3IgaW5kaXJlY3QKLQkJICogZW50aXR5IHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgZW50aXRpZXMuCi0JCSAqLwotCQllbHNlIGlmICgoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0FUVFJJQlVURV9WQUxVRSkgJiYKLQkJICAgICAgICAgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkpIHsKLQkJICAgIHhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfRU5USVRZX0lTX0VYVEVSTkFMLAotCQkJICJBdHRyaWJ1dGUgcmVmZXJlbmNlcyBleHRlcm5hbCBlbnRpdHkgJyVzJ1xuIiwgbmFtZSk7Ci0JCX0KLQkJLyoKLQkJICogWyBXRkM6IE5vIDwgaW4gQXR0cmlidXRlIFZhbHVlcyBdCi0JCSAqIFRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIGFueSBlbnRpdHkgcmVmZXJyZWQgdG8gZGlyZWN0bHkgb3IKLQkJICogaW5kaXJlY3RseSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUgKG90aGVyIHRoYW4gIiZsdDsiKSBtdXN0Ci0JCSAqIG5vdCBjb250YWluIGEgPC4gCi0JCSAqLwotCQllbHNlIGlmICgoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0FUVFJJQlVURV9WQUxVRSkgJiYKLQkJICAgICAgICAgKGVudCAhPSBOVUxMKSAmJgotCQkJICgheG1sU3RyRXF1YWwoZW50LT5uYW1lLCBCQURfQ0FTVCAibHQiKSkgJiYKLQkJICAgICAgICAgKGVudC0+Y29udGVudCAhPSBOVUxMKSAmJgotCQkJICh4bWxTdHJjaHIoZW50LT5jb250ZW50LCAnPCcpKSkgewotCQkgICAgeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9MVF9JTl9BVFRSSUJVVEUsCi0JICInPCcgaW4gZW50aXR5ICclcycgaXMgbm90IGFsbG93ZWQgaW4gYXR0cmlidXRlcyB2YWx1ZXNcbiIsIG5hbWUpOwotCQl9CisgICAgLyoKKyAgICAgKiBQcmVkZWZpbmVkIGVudGl0ZXMgb3ZlcnJpZGUgYW55IGV4dHJhIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBpZiAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfT0xEU0FYKSA9PSAwKSB7CisgICAgICAgIGVudCA9IHhtbEdldFByZWRlZmluZWRFbnRpdHkobmFtZSk7CisgICAgICAgIGlmIChlbnQgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihlbnQpOworICAgIH0KIAotCQkvKgotCQkgKiBJbnRlcm5hbCBjaGVjaywgbm8gcGFyYW1ldGVyIGVudGl0aWVzIGhlcmUgLi4uCi0JCSAqLwotCQllbHNlIHsKLQkJICAgIHN3aXRjaCAoZW50LT5ldHlwZSkgewotCQkJY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKLQkJCWNhc2UgWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6Ci0JCQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19QQVJBTUVURVIsCi0JCQkgIkF0dGVtcHQgdG8gcmVmZXJlbmNlIHRoZSBwYXJhbWV0ZXIgZW50aXR5ICclcydcbiIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfQorICAgIC8qCisgICAgICogSW5jcmVhdGUgdGhlIG51bWJlciBvZiBlbnRpdHkgcmVmZXJlbmNlcyBwYXJzZWQKKyAgICAgKi8KKyAgICBjdHh0LT5uYmVudGl0aWVzKys7CiAKLQkJLyoKLQkJICogWyBXRkM6IE5vIFJlY3Vyc2lvbiBdCi0JCSAqIEEgcGFyc2VkIGVudGl0eSBtdXN0IG5vdCBjb250YWluIGEgcmVjdXJzaXZlIHJlZmVyZW5jZQotCQkgKiB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiAKLQkJICogRG9uZSBzb21ld2hlcmUgZWxzZQotCQkgKi8KLQotCSAgICB9IGVsc2UgewotCQl4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VOVElUWVJFRl9TRU1JQ09MX01JU1NJTkcsIE5VTEwpOwotCSAgICB9CisgICAgLyoKKyAgICAgKiBBc2sgZmlyc3QgU0FYIGZvciBlbnRpdHkgcmVzb2x1dGlvbiwgb3RoZXJ3aXNlIHRyeSB0aGUKKyAgICAgKiBlbnRpdGllcyB3aGljaCBtYXkgaGF2ZSBzdG9yZWQgaW4gdGhlIHBhcnNlciBjb250ZXh0LgorICAgICAqLworICAgIGlmIChjdHh0LT5zYXggIT0gTlVMTCkgeworCWlmIChjdHh0LT5zYXgtPmdldEVudGl0eSAhPSBOVUxMKQorCSAgICBlbnQgPSBjdHh0LT5zYXgtPmdldEVudGl0eShjdHh0LT51c2VyRGF0YSwgbmFtZSk7CisJaWYgKChjdHh0LT53ZWxsRm9ybWVkID09IDEgKSAmJiAoZW50ID09IE5VTEwpICYmIAorCSAgICAoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9PTERTQVgpKQorCSAgICBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KG5hbWUpOworCWlmICgoY3R4dC0+d2VsbEZvcm1lZCA9PSAxICkgJiYgKGVudCA9PSBOVUxMKSAmJgorCSAgICAoY3R4dC0+dXNlckRhdGE9PWN0eHQpKSB7CisJICAgIGVudCA9IHhtbFNBWDJHZXRFbnRpdHkoY3R4dCwgbmFtZSk7CiAJfQogICAgIH0KKyAgICAvKgorICAgICAqIFsgV0ZDOiBFbnRpdHkgRGVjbGFyZWQgXQorICAgICAqIEluIGEgZG9jdW1lbnQgd2l0aG91dCBhbnkgRFRELCBhIGRvY3VtZW50IHdpdGggb25seSBhbgorICAgICAqIGludGVybmFsIERURCBzdWJzZXQgd2hpY2ggY29udGFpbnMgbm8gcGFyYW1ldGVyIGVudGl0eQorICAgICAqIHJlZmVyZW5jZXMsIG9yIGEgZG9jdW1lbnQgd2l0aCAic3RhbmRhbG9uZT0neWVzJyIsIHRoZQorICAgICAqIE5hbWUgZ2l2ZW4gaW4gdGhlIGVudGl0eSByZWZlcmVuY2UgbXVzdCBtYXRjaCB0aGF0IGluIGFuCisgICAgICogZW50aXR5IGRlY2xhcmF0aW9uLCBleGNlcHQgdGhhdCB3ZWxsLWZvcm1lZCBkb2N1bWVudHMKKyAgICAgKiBuZWVkIG5vdCBkZWNsYXJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGVudGl0aWVzOiBhbXAsIGx0LAorICAgICAqIGd0LCBhcG9zLCBxdW90LgorICAgICAqIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdCBwcmVjZWRlIGFueQorICAgICAqIHJlZmVyZW5jZSB0byBpdC4KKyAgICAgKiBTaW1pbGFybHksIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGdlbmVyYWwgZW50aXR5IG11c3QKKyAgICAgKiBwcmVjZWRlIGFueSByZWZlcmVuY2UgdG8gaXQgd2hpY2ggYXBwZWFycyBpbiBhIGRlZmF1bHQKKyAgICAgKiB2YWx1ZSBpbiBhbiBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbi4gTm90ZSB0aGF0IGlmCisgICAgICogZW50aXRpZXMgYXJlIGRlY2xhcmVkIGluIHRoZSBleHRlcm5hbCBzdWJzZXQgb3IgaW4KKyAgICAgKiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMsIGEgbm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29yCisgICAgICogaXMgbm90IG9ibGlnYXRlZCB0byByZWFkIGFuZCBwcm9jZXNzIHRoZWlyIGRlY2xhcmF0aW9uczsKKyAgICAgKiBmb3Igc3VjaCBkb2N1bWVudHMsIHRoZSBydWxlIHRoYXQgYW4gZW50aXR5IG11c3QgYmUKKyAgICAgKiBkZWNsYXJlZCBpcyBhIHdlbGwtZm9ybWVkbmVzcyBjb25zdHJhaW50IG9ubHkgaWYKKyAgICAgKiBzdGFuZGFsb25lPSd5ZXMnLgorICAgICAqLworICAgIGlmIChlbnQgPT0gTlVMTCkgeworCWlmICgoY3R4dC0+c3RhbmRhbG9uZSA9PSAxKSB8fAorCSAgICAoKGN0eHQtPmhhc0V4dGVybmFsU3Vic2V0ID09IDApICYmCisJICAgICAoY3R4dC0+aGFzUEVyZWZzID09IDApKSkgeworCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAorCQkgICAgICJFbnRpdHkgJyVzJyBub3QgZGVmaW5lZFxuIiwgbmFtZSk7CisJfSBlbHNlIHsKKwkgICAgeG1sRXJyTXNnU3RyKGN0eHQsIFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFksCisJCSAgICAgIkVudGl0eSAnJXMnIG5vdCBkZWZpbmVkXG4iLCBuYW1lKTsKKwkgICAgaWYgKChjdHh0LT5pblN1YnNldCA9PSAwKSAmJgorCQkoY3R4dC0+c2F4ICE9IE5VTEwpICYmCisJCShjdHh0LT5zYXgtPnJlZmVyZW5jZSAhPSBOVUxMKSkgeworCQljdHh0LT5zYXgtPnJlZmVyZW5jZShjdHh0LT51c2VyRGF0YSwgbmFtZSk7CisJICAgIH0KKwl9CisJY3R4dC0+dmFsaWQgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogWyBXRkM6IFBhcnNlZCBFbnRpdHkgXQorICAgICAqIEFuIGVudGl0eSByZWZlcmVuY2UgbXVzdCBub3QgY29udGFpbiB0aGUgbmFtZSBvZiBhbgorICAgICAqIHVucGFyc2VkIGVudGl0eQorICAgICAqLworICAgIGVsc2UgaWYgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZKSB7CisJeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9VTlBBUlNFRF9FTlRJVFksCisJCSAiRW50aXR5IHJlZmVyZW5jZSB0byB1bnBhcnNlZCBlbnRpdHkgJXNcbiIsIG5hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogWyBXRkM6IE5vIEV4dGVybmFsIEVudGl0eSBSZWZlcmVuY2VzIF0KKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWVzIGNhbm5vdCBjb250YWluIGRpcmVjdCBvciBpbmRpcmVjdAorICAgICAqIGVudGl0eSByZWZlcmVuY2VzIHRvIGV4dGVybmFsIGVudGl0aWVzLgorICAgICAqLworICAgIGVsc2UgaWYgKChjdHh0LT5pbnN0YXRlID09IFhNTF9QQVJTRVJfQVRUUklCVVRFX1ZBTFVFKSAmJgorCSAgICAgKGVudC0+ZXR5cGUgPT0gWE1MX0VYVEVSTkFMX0dFTkVSQUxfUEFSU0VEX0VOVElUWSkpIHsKKwl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19FWFRFUk5BTCwKKwkgICAgICJBdHRyaWJ1dGUgcmVmZXJlbmNlcyBleHRlcm5hbCBlbnRpdHkgJyVzJ1xuIiwgbmFtZSk7CisgICAgfQorICAgIC8qCisgICAgICogWyBXRkM6IE5vIDwgaW4gQXR0cmlidXRlIFZhbHVlcyBdCisgICAgICogVGhlIHJlcGxhY2VtZW50IHRleHQgb2YgYW55IGVudGl0eSByZWZlcnJlZCB0byBkaXJlY3RseSBvcgorICAgICAqIGluZGlyZWN0bHkgaW4gYW4gYXR0cmlidXRlIHZhbHVlIChvdGhlciB0aGFuICImbHQ7IikgbXVzdAorICAgICAqIG5vdCBjb250YWluIGEgPC4gCisgICAgICovCisgICAgZWxzZSBpZiAoKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9BVFRSSUJVVEVfVkFMVUUpICYmCisJICAgICAoZW50ICE9IE5VTEwpICYmIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkgJiYKKwkgICAgIChlbnQtPmV0eXBlICE9IFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSkgJiYKKwkgICAgICh4bWxTdHJjaHIoZW50LT5jb250ZW50LCAnPCcpKSkgeworCXhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfTFRfSU5fQVRUUklCVVRFLAorICAgICInPCcgaW4gZW50aXR5ICclcycgaXMgbm90IGFsbG93ZWQgaW4gYXR0cmlidXRlcyB2YWx1ZXNcbiIsIG5hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogSW50ZXJuYWwgY2hlY2ssIG5vIHBhcmFtZXRlciBlbnRpdGllcyBoZXJlIC4uLgorICAgICAqLworICAgIGVsc2UgeworCXN3aXRjaCAoZW50LT5ldHlwZSkgeworCSAgICBjYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorCSAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19QQVJBTUVURVIsCisJICAgICAiQXR0ZW1wdCB0byByZWZlcmVuY2UgdGhlIHBhcmFtZXRlciBlbnRpdHkgJyVzJ1xuIiwKKwkJCSAgICAgIG5hbWUpOworCSAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogWyBXRkM6IE5vIFJlY3Vyc2lvbiBdCisgICAgICogQSBwYXJzZWQgZW50aXR5IG11c3Qgbm90IGNvbnRhaW4gYSByZWN1cnNpdmUgcmVmZXJlbmNlCisgICAgICogdG8gaXRzZWxmLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gCisgICAgICogRG9uZSBzb21ld2hlcmUgZWxzZQorICAgICAqLwogICAgIHJldHVybihlbnQpOwogfQogCkBAIC02NTc2LDEyOSArNzIxMywxNTIgQEAKICAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIHB0ciA9ICpzdHI7CiAgICAgY3VyID0gKnB0cjsKLSAgICBpZiAoY3VyID09ICcmJykgewotICAgICAgICBwdHIrKzsKLQljdXIgPSAqcHRyOwotICAgICAgICBuYW1lID0geG1sUGFyc2VTdHJpbmdOYW1lKGN0eHQsICZwdHIpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9OQU1FX1JFUVVJUkVELAotCQkJICAgInhtbFBhcnNlU3RyaW5nRW50aXR5UmVmOiBubyBuYW1lXG4iKTsKLQl9IGVsc2UgewotCSAgICBpZiAoKnB0ciA9PSAnOycpIHsKLQkgICAgICAgIHB0cisrOwotCQkvKgotCQkgKiBBc2sgZmlyc3QgU0FYIGZvciBlbnRpdHkgcmVzb2x1dGlvbiwgb3RoZXJ3aXNlIHRyeSB0aGUKLQkJICogcHJlZGVmaW5lZCBzZXQuCi0JCSAqLwotCQlpZiAoY3R4dC0+c2F4ICE9IE5VTEwpIHsKLQkJICAgIGlmIChjdHh0LT5zYXgtPmdldEVudGl0eSAhPSBOVUxMKQotCQkJZW50ID0gY3R4dC0+c2F4LT5nZXRFbnRpdHkoY3R4dC0+dXNlckRhdGEsIG5hbWUpOwotCQkgICAgaWYgKGVudCA9PSBOVUxMKQotCQkgICAgICAgIGVudCA9IHhtbEdldFByZWRlZmluZWRFbnRpdHkobmFtZSk7Ci0JCSAgICBpZiAoKGVudCA9PSBOVUxMKSAmJiAoY3R4dC0+dXNlckRhdGE9PWN0eHQpKSB7Ci0JCQllbnQgPSB4bWxTQVgyR2V0RW50aXR5KGN0eHQsIG5hbWUpOwotCQkgICAgfQotCQl9Ci0JCS8qCi0JCSAqIFsgV0ZDOiBFbnRpdHkgRGVjbGFyZWQgXQotCQkgKiBJbiBhIGRvY3VtZW50IHdpdGhvdXQgYW55IERURCwgYSBkb2N1bWVudCB3aXRoIG9ubHkgYW4KLQkJICogaW50ZXJuYWwgRFREIHN1YnNldCB3aGljaCBjb250YWlucyBubyBwYXJhbWV0ZXIgZW50aXR5Ci0JCSAqIHJlZmVyZW5jZXMsIG9yIGEgZG9jdW1lbnQgd2l0aCAic3RhbmRhbG9uZT0neWVzJyIsIHRoZQotCQkgKiBOYW1lIGdpdmVuIGluIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG11c3QgbWF0Y2ggdGhhdCBpbiBhbgotCQkgKiBlbnRpdHkgZGVjbGFyYXRpb24sIGV4Y2VwdCB0aGF0IHdlbGwtZm9ybWVkIGRvY3VtZW50cwotCQkgKiBuZWVkIG5vdCBkZWNsYXJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGVudGl0aWVzOiBhbXAsIGx0LAotCQkgKiBndCwgYXBvcywgcXVvdC4KLQkJICogVGhlIGRlY2xhcmF0aW9uIG9mIGEgcGFyYW1ldGVyIGVudGl0eSBtdXN0IHByZWNlZGUgYW55Ci0JCSAqIHJlZmVyZW5jZSB0byBpdC4KLQkJICogU2ltaWxhcmx5LCB0aGUgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmFsIGVudGl0eSBtdXN0Ci0JCSAqIHByZWNlZGUgYW55IHJlZmVyZW5jZSB0byBpdCB3aGljaCBhcHBlYXJzIGluIGEgZGVmYXVsdAotCQkgKiB2YWx1ZSBpbiBhbiBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbi4gTm90ZSB0aGF0IGlmCi0JCSAqIGVudGl0aWVzIGFyZSBkZWNsYXJlZCBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0IG9yIGluCi0JCSAqIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcywgYSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3IKLQkJICogaXMgbm90IG9ibGlnYXRlZCB0byByZWFkIGFuZCBwcm9jZXNzIHRoZWlyIGRlY2xhcmF0aW9uczsKLQkJICogZm9yIHN1Y2ggZG9jdW1lbnRzLCB0aGUgcnVsZSB0aGF0IGFuIGVudGl0eSBtdXN0IGJlCi0JCSAqIGRlY2xhcmVkIGlzIGEgd2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnQgb25seSBpZgotCQkgKiBzdGFuZGFsb25lPSd5ZXMnLiAKLQkJICovCi0JCWlmIChlbnQgPT0gTlVMTCkgewotCQkgICAgaWYgKChjdHh0LT5zdGFuZGFsb25lID09IDEpIHx8Ci0JCSAgICAgICAgKChjdHh0LT5oYXNFeHRlcm5hbFN1YnNldCA9PSAwKSAmJgotCQkJIChjdHh0LT5oYXNQRXJlZnMgPT0gMCkpKSB7Ci0JCQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAotCQkJCSAiRW50aXR5ICclcycgbm90IGRlZmluZWRcbiIsIG5hbWUpOwotCQkgICAgfSBlbHNlIHsKLQkJCXhtbEVyck1zZ1N0cihjdHh0LCBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZLAotCQkJCSAgICAgICJFbnRpdHkgJyVzJyBub3QgZGVmaW5lZFxuIiwKLQkJCQkgICAgICBuYW1lKTsKLQkJICAgIH0KLQkJICAgIC8qIFRPRE8gPyBjaGVjayByZWdyZXNzaW9ucyBjdHh0LT52YWxpZCA9IDA7ICovCi0JCX0KKyAgICBpZiAoY3VyICE9ICcmJykKKwlyZXR1cm4oTlVMTCk7CiAKLQkJLyoKLQkJICogWyBXRkM6IFBhcnNlZCBFbnRpdHkgXQotCQkgKiBBbiBlbnRpdHkgcmVmZXJlbmNlIG11c3Qgbm90IGNvbnRhaW4gdGhlIG5hbWUgb2YgYW4KLQkJICogdW5wYXJzZWQgZW50aXR5Ci0JCSAqLwotCQllbHNlIGlmIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWSkgewotCQkgICAgeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9VTlBBUlNFRF9FTlRJVFksCi0JCQkgICAgICJFbnRpdHkgcmVmZXJlbmNlIHRvIHVucGFyc2VkIGVudGl0eSAlc1xuIiwgbmFtZSk7Ci0JCX0KKyAgICBwdHIrKzsKKyAgICBjdXIgPSAqcHRyOworICAgIG5hbWUgPSB4bWxQYXJzZVN0cmluZ05hbWUoY3R4dCwgJnB0cik7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworCXhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfTkFNRV9SRVFVSVJFRCwKKwkJICAgICAgICJ4bWxQYXJzZVN0cmluZ0VudGl0eVJlZjogbm8gbmFtZVxuIik7CisJKnN0ciA9IHB0cjsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGlmICgqcHRyICE9ICc7JykgeworCXhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfRU5USVRZUkVGX1NFTUlDT0xfTUlTU0lORywgTlVMTCk7CisgICAgICAgIHhtbEZyZWUobmFtZSk7CisJKnN0ciA9IHB0cjsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHB0cisrOwogCi0JCS8qCi0JCSAqIFsgV0ZDOiBObyBFeHRlcm5hbCBFbnRpdHkgUmVmZXJlbmNlcyBdCi0JCSAqIEF0dHJpYnV0ZSB2YWx1ZXMgY2Fubm90IGNvbnRhaW4gZGlyZWN0IG9yIGluZGlyZWN0Ci0JCSAqIGVudGl0eSByZWZlcmVuY2VzIHRvIGV4dGVybmFsIGVudGl0aWVzLgotCQkgKi8KLQkJZWxzZSBpZiAoKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9BVFRSSUJVVEVfVkFMVUUpICYmCi0JCSAgICAgICAgIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFkpKSB7Ci0JCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19FWFRFUk5BTCwKLQkJICAgICAiQXR0cmlidXRlIHJlZmVyZW5jZXMgZXh0ZXJuYWwgZW50aXR5ICclcydcbiIsIG5hbWUpOwotCQl9Ci0JCS8qCi0JCSAqIFsgV0ZDOiBObyA8IGluIEF0dHJpYnV0ZSBWYWx1ZXMgXQotCQkgKiBUaGUgcmVwbGFjZW1lbnQgdGV4dCBvZiBhbnkgZW50aXR5IHJlZmVycmVkIHRvIGRpcmVjdGx5IG9yCi0JCSAqIGluZGlyZWN0bHkgaW4gYW4gYXR0cmlidXRlIHZhbHVlIChvdGhlciB0aGFuICImbHQ7IikgbXVzdAotCQkgKiBub3QgY29udGFpbiBhIDwuIAotCQkgKi8KLQkJZWxzZSBpZiAoKGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9BVFRSSUJVVEVfVkFMVUUpICYmCi0JCSAgICAgICAgIChlbnQgIT0gTlVMTCkgJiYKLQkJCSAoIXhtbFN0ckVxdWFsKGVudC0+bmFtZSwgQkFEX0NBU1QgImx0IikpICYmCi0JCSAgICAgICAgIChlbnQtPmNvbnRlbnQgIT0gTlVMTCkgJiYKLQkJCSAoeG1sU3RyY2hyKGVudC0+Y29udGVudCwgJzwnKSkpIHsKLQkJICAgIHhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfTFRfSU5fQVRUUklCVVRFLAotCQkgIic8JyBpbiBlbnRpdHkgJyVzJyBpcyBub3QgYWxsb3dlZCBpbiBhdHRyaWJ1dGVzIHZhbHVlc1xuIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQkJfQogCi0JCS8qCi0JCSAqIEludGVybmFsIGNoZWNrLCBubyBwYXJhbWV0ZXIgZW50aXRpZXMgaGVyZSAuLi4KLQkJICovCi0JCWVsc2UgewotCQkgICAgc3dpdGNoIChlbnQtPmV0eXBlKSB7Ci0JCQljYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgotCQkJY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKLQkJCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19QQVJBTUVURVIsCi0JCQkgIkF0dGVtcHQgdG8gcmVmZXJlbmNlIHRoZSBwYXJhbWV0ZXIgZW50aXR5ICclcydcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfQorICAgIC8qCisgICAgICogUHJlZGVmaW5lZCBlbnRpdGVzIG92ZXJyaWRlIGFueSBleHRyYSBkZWZpbml0aW9uCisgICAgICovCisgICAgaWYgKChjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX09MRFNBWCkgPT0gMCkgeworICAgICAgICBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KG5hbWUpOworICAgICAgICBpZiAoZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHhtbEZyZWUobmFtZSk7CisgICAgICAgICAgICAqc3RyID0gcHRyOworICAgICAgICAgICAgcmV0dXJuKGVudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJLyoKLQkJICogWyBXRkM6IE5vIFJlY3Vyc2lvbiBdCi0JCSAqIEEgcGFyc2VkIGVudGl0eSBtdXN0IG5vdCBjb250YWluIGEgcmVjdXJzaXZlIHJlZmVyZW5jZQotCQkgKiB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiAKLQkJICogRG9uZSBzb21ld2hlcmUgZWxzZQotCQkgKi8KKyAgICAvKgorICAgICAqIEluY3JlYXRlIHRoZSBudW1iZXIgb2YgZW50aXR5IHJlZmVyZW5jZXMgcGFyc2VkCisgICAgICovCisgICAgY3R4dC0+bmJlbnRpdGllcysrOwogCi0JICAgIH0gZWxzZSB7Ci0JCXhtbEZhdGFsRXJyKGN0eHQsIFhNTF9FUlJfRU5USVRZUkVGX1NFTUlDT0xfTUlTU0lORywgTlVMTCk7Ci0JICAgIH0KLQkgICAgeG1sRnJlZShuYW1lKTsKKyAgICAvKgorICAgICAqIEFzayBmaXJzdCBTQVggZm9yIGVudGl0eSByZXNvbHV0aW9uLCBvdGhlcndpc2UgdHJ5IHRoZQorICAgICAqIGVudGl0aWVzIHdoaWNoIG1heSBoYXZlIHN0b3JlZCBpbiB0aGUgcGFyc2VyIGNvbnRleHQuCisgICAgICovCisgICAgaWYgKGN0eHQtPnNheCAhPSBOVUxMKSB7CisJaWYgKGN0eHQtPnNheC0+Z2V0RW50aXR5ICE9IE5VTEwpCisJICAgIGVudCA9IGN0eHQtPnNheC0+Z2V0RW50aXR5KGN0eHQtPnVzZXJEYXRhLCBuYW1lKTsKKwlpZiAoKGVudCA9PSBOVUxMKSAmJiAoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9PTERTQVgpKQorCSAgICBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KG5hbWUpOworCWlmICgoZW50ID09IE5VTEwpICYmIChjdHh0LT51c2VyRGF0YT09Y3R4dCkpIHsKKwkgICAgZW50ID0geG1sU0FYMkdldEVudGl0eShjdHh0LCBuYW1lKTsKIAl9CiAgICAgfQorCisgICAgLyoKKyAgICAgKiBbIFdGQzogRW50aXR5IERlY2xhcmVkIF0KKyAgICAgKiBJbiBhIGRvY3VtZW50IHdpdGhvdXQgYW55IERURCwgYSBkb2N1bWVudCB3aXRoIG9ubHkgYW4KKyAgICAgKiBpbnRlcm5hbCBEVEQgc3Vic2V0IHdoaWNoIGNvbnRhaW5zIG5vIHBhcmFtZXRlciBlbnRpdHkKKyAgICAgKiByZWZlcmVuY2VzLCBvciBhIGRvY3VtZW50IHdpdGggInN0YW5kYWxvbmU9J3llcyciLCB0aGUKKyAgICAgKiBOYW1lIGdpdmVuIGluIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG11c3QgbWF0Y2ggdGhhdCBpbiBhbgorICAgICAqIGVudGl0eSBkZWNsYXJhdGlvbiwgZXhjZXB0IHRoYXQgd2VsbC1mb3JtZWQgZG9jdW1lbnRzCisgICAgICogbmVlZCBub3QgZGVjbGFyZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBlbnRpdGllczogYW1wLCBsdCwKKyAgICAgKiBndCwgYXBvcywgcXVvdC4KKyAgICAgKiBUaGUgZGVjbGFyYXRpb24gb2YgYSBwYXJhbWV0ZXIgZW50aXR5IG11c3QgcHJlY2VkZSBhbnkKKyAgICAgKiByZWZlcmVuY2UgdG8gaXQuCisgICAgICogU2ltaWxhcmx5LCB0aGUgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmFsIGVudGl0eSBtdXN0CisgICAgICogcHJlY2VkZSBhbnkgcmVmZXJlbmNlIHRvIGl0IHdoaWNoIGFwcGVhcnMgaW4gYSBkZWZhdWx0CisgICAgICogdmFsdWUgaW4gYW4gYXR0cmlidXRlLWxpc3QgZGVjbGFyYXRpb24uIE5vdGUgdGhhdCBpZgorICAgICAqIGVudGl0aWVzIGFyZSBkZWNsYXJlZCBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0IG9yIGluCisgICAgICogZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzLCBhIG5vbi12YWxpZGF0aW5nIHByb2Nlc3NvcgorICAgICAqIGlzIG5vdCBvYmxpZ2F0ZWQgdG8gcmVhZCBhbmQgcHJvY2VzcyB0aGVpciBkZWNsYXJhdGlvbnM7CisgICAgICogZm9yIHN1Y2ggZG9jdW1lbnRzLCB0aGUgcnVsZSB0aGF0IGFuIGVudGl0eSBtdXN0IGJlCisgICAgICogZGVjbGFyZWQgaXMgYSB3ZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludCBvbmx5IGlmCisgICAgICogc3RhbmRhbG9uZT0neWVzJy4gCisgICAgICovCisgICAgaWYgKGVudCA9PSBOVUxMKSB7CisJaWYgKChjdHh0LT5zdGFuZGFsb25lID09IDEpIHx8CisJICAgICgoY3R4dC0+aGFzRXh0ZXJuYWxTdWJzZXQgPT0gMCkgJiYKKwkgICAgIChjdHh0LT5oYXNQRXJlZnMgPT0gMCkpKSB7CisJICAgIHhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5ERUNMQVJFRF9FTlRJVFksCisJCSAgICAgIkVudGl0eSAnJXMnIG5vdCBkZWZpbmVkXG4iLCBuYW1lKTsKKwl9IGVsc2UgeworCSAgICB4bWxFcnJNc2dTdHIoY3R4dCwgWE1MX1dBUl9VTkRFQ0xBUkVEX0VOVElUWSwKKwkJCSAgIkVudGl0eSAnJXMnIG5vdCBkZWZpbmVkXG4iLAorCQkJICBuYW1lKTsKKwl9CisJLyogVE9ETyA/IGNoZWNrIHJlZ3Jlc3Npb25zIGN0eHQtPnZhbGlkID0gMDsgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIFsgV0ZDOiBQYXJzZWQgRW50aXR5IF0KKyAgICAgKiBBbiBlbnRpdHkgcmVmZXJlbmNlIG11c3Qgbm90IGNvbnRhaW4gdGhlIG5hbWUgb2YgYW4KKyAgICAgKiB1bnBhcnNlZCBlbnRpdHkKKyAgICAgKi8KKyAgICBlbHNlIGlmIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1VOUEFSU0VEX0VOVElUWSkgeworCXhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5QQVJTRURfRU5USVRZLAorCQkgIkVudGl0eSByZWZlcmVuY2UgdG8gdW5wYXJzZWQgZW50aXR5ICVzXG4iLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFsgV0ZDOiBObyBFeHRlcm5hbCBFbnRpdHkgUmVmZXJlbmNlcyBdCisgICAgICogQXR0cmlidXRlIHZhbHVlcyBjYW5ub3QgY29udGFpbiBkaXJlY3Qgb3IgaW5kaXJlY3QKKyAgICAgKiBlbnRpdHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBlbnRpdGllcy4KKyAgICAgKi8KKyAgICBlbHNlIGlmICgoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0FUVFJJQlVURV9WQUxVRSkgJiYKKwkgICAgIChlbnQtPmV0eXBlID09IFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFkpKSB7CisJeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9FTlRJVFlfSVNfRVhURVJOQUwsCisJICJBdHRyaWJ1dGUgcmVmZXJlbmNlcyBleHRlcm5hbCBlbnRpdHkgJyVzJ1xuIiwgbmFtZSk7CisgICAgfQorICAgIC8qCisgICAgICogWyBXRkM6IE5vIDwgaW4gQXR0cmlidXRlIFZhbHVlcyBdCisgICAgICogVGhlIHJlcGxhY2VtZW50IHRleHQgb2YgYW55IGVudGl0eSByZWZlcnJlZCB0byBkaXJlY3RseSBvcgorICAgICAqIGluZGlyZWN0bHkgaW4gYW4gYXR0cmlidXRlIHZhbHVlIChvdGhlciB0aGFuICImbHQ7IikgbXVzdAorICAgICAqIG5vdCBjb250YWluIGEgPC4KKyAgICAgKi8KKyAgICBlbHNlIGlmICgoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0FUVFJJQlVURV9WQUxVRSkgJiYKKwkgICAgIChlbnQgIT0gTlVMTCkgJiYgKGVudC0+Y29udGVudCAhPSBOVUxMKSAmJgorCSAgICAgKGVudC0+ZXR5cGUgIT0gWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZKSAmJgorCSAgICAgKHhtbFN0cmNocihlbnQtPmNvbnRlbnQsICc8JykpKSB7CisJeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9MVF9JTl9BVFRSSUJVVEUsCisgICAgICInPCcgaW4gZW50aXR5ICclcycgaXMgbm90IGFsbG93ZWQgaW4gYXR0cmlidXRlcyB2YWx1ZXNcbiIsCisJCQkgIG5hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogSW50ZXJuYWwgY2hlY2ssIG5vIHBhcmFtZXRlciBlbnRpdGllcyBoZXJlIC4uLgorICAgICAqLworICAgIGVsc2UgeworCXN3aXRjaCAoZW50LT5ldHlwZSkgeworCSAgICBjYXNlIFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorCSAgICBjYXNlIFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZOgorCQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0VOVElUWV9JU19QQVJBTUVURVIsCisJICAgICAiQXR0ZW1wdCB0byByZWZlcmVuY2UgdGhlIHBhcmFtZXRlciBlbnRpdHkgJyVzJ1xuIiwKKwkJCQkgIG5hbWUpOworCSAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogWyBXRkM6IE5vIFJlY3Vyc2lvbiBdCisgICAgICogQSBwYXJzZWQgZW50aXR5IG11c3Qgbm90IGNvbnRhaW4gYSByZWN1cnNpdmUgcmVmZXJlbmNlCisgICAgICogdG8gaXRzZWxmLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KKyAgICAgKiBEb25lIHNvbWV3aGVyZSBlbHNlCisgICAgICovCisKKyAgICB4bWxGcmVlKG5hbWUpOwogICAgICpzdHIgPSBwdHI7CiAgICAgcmV0dXJuKGVudCk7CiB9CkBAIC02NzM5LDkwICs3Mzk5LDE4NSBAQAogICAgIHhtbEVudGl0eVB0ciBlbnRpdHkgPSBOVUxMOwogICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OwogCi0gICAgaWYgKFJBVyA9PSAnJScpIHsKLSAgICAgICAgTkVYVDsKLSAgICAgICAgbmFtZSA9IHhtbFBhcnNlTmFtZShjdHh0KTsKLSAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9OQU1FX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInhtbFBhcnNlUEVSZWZlcmVuY2U6IG5vIG5hbWVcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFJBVyA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBORVhUOwotICAgICAgICAgICAgICAgIGlmICgoY3R4dC0+c2F4ICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChjdHh0LT5zYXgtPmdldFBhcmFtZXRlckVudGl0eSAhPSBOVUxMKSkKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gY3R4dC0+c2F4LT5nZXRQYXJhbWV0ZXJFbnRpdHkoY3R4dC0+dXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBbIFdGQzogRW50aXR5IERlY2xhcmVkIF0KLSAgICAgICAgICAgICAgICAgICAgICogSW4gYSBkb2N1bWVudCB3aXRob3V0IGFueSBEVEQsIGEgZG9jdW1lbnQgd2l0aCBvbmx5IGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybmFsIERURCBzdWJzZXQgd2hpY2ggY29udGFpbnMgbm8gcGFyYW1ldGVyIGVudGl0eQotICAgICAgICAgICAgICAgICAgICAgKiByZWZlcmVuY2VzLCBvciBhIGRvY3VtZW50IHdpdGggInN0YW5kYWxvbmU9J3llcyciLCAuLi4KLSAgICAgICAgICAgICAgICAgICAgICogLi4uIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdCBwcmVjZWRlCi0gICAgICAgICAgICAgICAgICAgICAqIGFueSByZWZlcmVuY2UgdG8gaXQuLi4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY3R4dC0+c3RhbmRhbG9uZSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKChjdHh0LT5oYXNFeHRlcm5hbFN1YnNldCA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChjdHh0LT5oYXNQRXJlZnMgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBbIFZDOiBFbnRpdHkgRGVjbGFyZWQgXQotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gYSBkb2N1bWVudCB3aXRoIGFuIGV4dGVybmFsIHN1YnNldCBvciBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICogcGFyYW1ldGVyIGVudGl0aWVzIHdpdGggInN0YW5kYWxvbmU9J25vJyIsIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICogLi4uIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdAotCQkJICogcHJlY2VkZSBhbnkgcmVmZXJlbmNlIHRvIGl0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9VTkRFQ0xBUkVEX0VOVElUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+dmFsaWQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogSW50ZXJuYWwgY2hlY2tpbmcgaW4gY2FzZSB0aGUgZW50aXR5IHF1ZXN0IGJhcmZlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRpdHktPmV0eXBlICE9IFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGVudGl0eS0+ZXR5cGUgIT0gWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFksCi0JCQkgICAgICAiSW50ZXJuYWw6ICUlJXM7IGlzIG5vdCBhIHBhcmFtZXRlciBlbnRpdHlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eHQtPmlucHV0LT5mcmVlICE9IGRlYWxsb2NibGFua3N3cmFwcGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmV3QmxhbmtzV3JhcHBlcklucHV0U3RyZWFtKGN0eHQsIGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxQdXNoSW5wdXQoY3R4dCwgaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFRPRE8gISEhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBoYW5kbGUgdGhlIGV4dHJhIHNwYWNlcyBhZGRlZCBiZWZvcmUgYW5kIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjLmYuIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjYXMtUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sUHVzaElucHV0KGN0eHQsIGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW50aXR5LT5ldHlwZSA9PSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkgJiYKLQkJCSAgICAoQ01QNShDVVJfUFRSLCAnPCcsICc/JywgJ3gnLCAnbScsICdsJykpICYmCi0JCQkgICAgKElTX0JMQU5LX0NIKE5YVCg1KSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sUGFyc2VUZXh0RGVjbChjdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dC0+ZXJyTm8gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VSUl9VTlNVUFBPUlRFRF9FTkNPRElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgWE1MIFJFQyBpbnN0cnVjdHMgdXMgdG8gc3RvcCBwYXJzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJpZ2h0IGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0VPRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdHh0LT5oYXNQRXJlZnMgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VOVElUWVJFRl9TRU1JQ09MX01JU1NJTkcsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKFJBVyAhPSAnJScpCisgICAgICAgIHJldHVybjsKKyAgICBORVhUOworICAgIG5hbWUgPSB4bWxQYXJzZU5hbWUoY3R4dCk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworCXhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfTkFNRV9SRVFVSVJFRCwKKwkJICAgICAgICJ4bWxQYXJzZVBFUmVmZXJlbmNlOiBubyBuYW1lXG4iKTsKKwlyZXR1cm47CiAgICAgfQorICAgIGlmIChSQVcgIT0gJzsnKSB7CisJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9FTlRJVFlSRUZfU0VNSUNPTF9NSVNTSU5HLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE5FWFQ7CisKKyAgICAvKgorICAgICAqIEluY3JlYXRlIHRoZSBudW1iZXIgb2YgZW50aXR5IHJlZmVyZW5jZXMgcGFyc2VkCisgICAgICovCisgICAgY3R4dC0+bmJlbnRpdGllcysrOworCisgICAgLyoKKyAgICAgKiBSZXF1ZXN0IHRoZSBlbnRpdHkgZnJvbSBTQVgKKyAgICAgKi8KKyAgICBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJgorCShjdHh0LT5zYXgtPmdldFBhcmFtZXRlckVudGl0eSAhPSBOVUxMKSkKKwllbnRpdHkgPSBjdHh0LT5zYXgtPmdldFBhcmFtZXRlckVudGl0eShjdHh0LT51c2VyRGF0YSwKKwkJCQkJICAgICAgIG5hbWUpOworICAgIGlmIChlbnRpdHkgPT0gTlVMTCkgeworCS8qCisJICogWyBXRkM6IEVudGl0eSBEZWNsYXJlZCBdCisJICogSW4gYSBkb2N1bWVudCB3aXRob3V0IGFueSBEVEQsIGEgZG9jdW1lbnQgd2l0aCBvbmx5IGFuCisJICogaW50ZXJuYWwgRFREIHN1YnNldCB3aGljaCBjb250YWlucyBubyBwYXJhbWV0ZXIgZW50aXR5CisJICogcmVmZXJlbmNlcywgb3IgYSBkb2N1bWVudCB3aXRoICJzdGFuZGFsb25lPSd5ZXMnIiwgLi4uCisJICogLi4uIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdCBwcmVjZWRlCisJICogYW55IHJlZmVyZW5jZSB0byBpdC4uLgorCSAqLworCWlmICgoY3R4dC0+c3RhbmRhbG9uZSA9PSAxKSB8fAorCSAgICAoKGN0eHQtPmhhc0V4dGVybmFsU3Vic2V0ID09IDApICYmCisJICAgICAoY3R4dC0+aGFzUEVyZWZzID09IDApKSkgeworCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAorCQkJICAgICAgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsCisJCQkgICAgICBuYW1lKTsKKwl9IGVsc2UgeworCSAgICAvKgorCSAgICAgKiBbIFZDOiBFbnRpdHkgRGVjbGFyZWQgXQorCSAgICAgKiBJbiBhIGRvY3VtZW50IHdpdGggYW4gZXh0ZXJuYWwgc3Vic2V0IG9yIGV4dGVybmFsCisJICAgICAqIHBhcmFtZXRlciBlbnRpdGllcyB3aXRoICJzdGFuZGFsb25lPSdubyciLCAuLi4KKwkgICAgICogLi4uIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdAorCSAgICAgKiBwcmVjZWRlIGFueSByZWZlcmVuY2UgdG8gaXQuLi4KKwkgICAgICovCisJICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9VTkRFQ0xBUkVEX0VOVElUWSwKKwkJCSAgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsCisJCQkgIG5hbWUsIE5VTEwpOworCSAgICBjdHh0LT52YWxpZCA9IDA7CisJfQorICAgIH0gZWxzZSB7CisJLyoKKwkgKiBJbnRlcm5hbCBjaGVja2luZyBpbiBjYXNlIHRoZSBlbnRpdHkgcXVlc3QgYmFyZmVkCisJICovCisJaWYgKChlbnRpdHktPmV0eXBlICE9IFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgorCSAgICAoZW50aXR5LT5ldHlwZSAhPSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWSkpIHsKKwkgICAgeG1sV2FybmluZ01zZyhjdHh0LCBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZLAorCQkgICJJbnRlcm5hbDogJSUlczsgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eVxuIiwKKwkJCSAgbmFtZSwgTlVMTCk7CisJfSBlbHNlIGlmIChjdHh0LT5pbnB1dC0+ZnJlZSAhPSBkZWFsbG9jYmxhbmtzd3JhcHBlcikgeworCSAgICBpbnB1dCA9IHhtbE5ld0JsYW5rc1dyYXBwZXJJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOworCSAgICBpZiAoeG1sUHVzaElucHV0KGN0eHQsIGlucHV0KSA8IDApCisJCXJldHVybjsKKwl9IGVsc2UgeworCSAgICAvKgorCSAgICAgKiBUT0RPICEhIQorCSAgICAgKiBoYW5kbGUgdGhlIGV4dHJhIHNwYWNlcyBhZGRlZCBiZWZvcmUgYW5kIGFmdGVyCisJICAgICAqIGMuZi4gaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNhcy1QRQorCSAgICAgKi8KKwkgICAgaW5wdXQgPSB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOworCSAgICBpZiAoeG1sUHVzaElucHV0KGN0eHQsIGlucHV0KSA8IDApCisJCXJldHVybjsKKwkgICAgaWYgKChlbnRpdHktPmV0eXBlID09IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgorCQkoQ01QNShDVVJfUFRSLCAnPCcsICc/JywgJ3gnLCAnbScsICdsJykpICYmCisJCShJU19CTEFOS19DSChOWFQoNSkpKSkgeworCQl4bWxQYXJzZVRleHREZWNsKGN0eHQpOworCQlpZiAoY3R4dC0+ZXJyTm8gPT0KKwkJICAgIFhNTF9FUlJfVU5TVVBQT1JURURfRU5DT0RJTkcpIHsKKwkJICAgIC8qCisJCSAgICAgKiBUaGUgWE1MIFJFQyBpbnN0cnVjdHMgdXMgdG8gc3RvcCBwYXJzaW5nCisJCSAgICAgKiByaWdodCBoZXJlCisJCSAgICAgKi8KKwkJICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0VPRjsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBjdHh0LT5oYXNQRXJlZnMgPSAxOworfQorCisvKioKKyAqIHhtbExvYWRFbnRpdHlDb250ZW50OgorICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKKyAqIEBlbnRpdHk6IGFuIHVubG9hZGVkIHN5c3RlbSBlbnRpdHkKKyAqCisgKiBMb2FkIHRoZSBvcmlnaW5hbCBjb250ZW50IG9mIHRoZSBnaXZlbiBzeXN0ZW0gZW50aXR5IGZyb20gdGhlCisgKiBFeHRlcm5hbElEL1N5c3RlbUlEIGdpdmVuLiBUaGlzIGlzIHRvIGJlIHVzZWQgZm9yIEluY2x1ZGVkIGluIExpdGVyYWwKKyAqIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI2lubGl0ZXJhbCBwcm9jZXNzaW5nIG9mIGVudGl0aWVzIHJlZmVyZW5jZXMKKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAtMSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoreG1sTG9hZEVudGl0eUNvbnRlbnQoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxFbnRpdHlQdHIgZW50aXR5KSB7CisgICAgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQ7CisgICAgeG1sQnVmZmVyUHRyIGJ1ZjsKKyAgICBpbnQgbCwgYzsKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChlbnRpdHkgPT0gTlVMTCkgfHwKKyAgICAgICAgKChlbnRpdHktPmV0eXBlICE9IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgorCSAoZW50aXR5LT5ldHlwZSAhPSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZKSkgfHwKKwkoZW50aXR5LT5jb250ZW50ICE9IE5VTEwpKSB7CisJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKKwkgICAgICAgICAgICAieG1sTG9hZEVudGl0eUNvbnRlbnQgcGFyYW1ldGVyIGVycm9yIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaWYgKHhtbFBhcnNlckRlYnVnRW50aXRpZXMpCisJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCSJSZWFkaW5nICVzIGVudGl0eSBjb250ZW50IGlucHV0XG4iLCBlbnRpdHktPm5hbWUpOworCisgICAgYnVmID0geG1sQnVmZmVyQ3JlYXRlKCk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKKwkgICAgICAgICAgICAieG1sTG9hZEVudGl0eUNvbnRlbnQgcGFyYW1ldGVyIGVycm9yIik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgaW5wdXQgPSB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbShjdHh0LCBlbnRpdHkpOworICAgIGlmIChpbnB1dCA9PSBOVUxMKSB7CisJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKKwkgICAgICAgICAgICAieG1sTG9hZEVudGl0eUNvbnRlbnQgaW5wdXQgZXJyb3IiKTsKKwl4bWxCdWZmZXJGcmVlKGJ1Zik7CisgICAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQdXNoIHRoZSBlbnRpdHkgYXMgdGhlIGN1cnJlbnQgaW5wdXQsIHJlYWQgY2hhciBieSBjaGFyCisgICAgICogc2F2aW5nIHRvIHRoZSBidWZmZXIgdW50aWwgdGhlIGVuZCBvZiB0aGUgZW50aXR5IG9yIGFuIGVycm9yCisgICAgICovCisgICAgaWYgKHhtbFB1c2hJbnB1dChjdHh0LCBpbnB1dCkgPCAwKSB7CisgICAgICAgIHhtbEJ1ZmZlckZyZWUoYnVmKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKworICAgIEdST1c7CisgICAgYyA9IENVUl9DSEFSKGwpOworICAgIHdoaWxlICgoY3R4dC0+aW5wdXQgPT0gaW5wdXQpICYmIChjdHh0LT5pbnB1dC0+Y3VyIDwgY3R4dC0+aW5wdXQtPmVuZCkgJiYKKyAgICAgICAgICAgKElTX0NIQVIoYykpKSB7CisgICAgICAgIHhtbEJ1ZmZlckFkZChidWYsIGN0eHQtPmlucHV0LT5jdXIsIGwpOworCWlmIChjb3VudCsrID4gMTAwKSB7CisJICAgIGNvdW50ID0gMDsKKwkgICAgR1JPVzsKKwl9CisJTkVYVEwobCk7CisJYyA9IENVUl9DSEFSKGwpOworICAgIH0KKworICAgIGlmICgoY3R4dC0+aW5wdXQgPT0gaW5wdXQpICYmIChjdHh0LT5pbnB1dC0+Y3VyID49IGN0eHQtPmlucHV0LT5lbmQpKSB7CisgICAgICAgIHhtbFBvcElucHV0KGN0eHQpOworICAgIH0gZWxzZSBpZiAoIUlTX0NIQVIoYykpIHsKKyAgICAgICAgeG1sRmF0YWxFcnJNc2dJbnQoY3R4dCwgWE1MX0VSUl9JTlZBTElEX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxMb2FkRW50aXR5Q29udGVudDogaW52YWxpZCBjaGFyIHZhbHVlICVkXG4iLAorCSAgICAgICAgICAgICAgICAgIGMpOworCXhtbEJ1ZmZlckZyZWUoYnVmKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKyAgICBlbnRpdHktPmNvbnRlbnQgPSBidWYtPmNvbnRlbnQ7CisgICAgYnVmLT5jb250ZW50ID0gTlVMTDsKKyAgICB4bWxCdWZmZXJGcmVlKGJ1Zik7CisKKyAgICByZXR1cm4oMCk7CiB9CiAKIC8qKgpAQCAtNjgzNiw3ICs3NTkxLDcgQEAKICAqCiAgKiBbIFdGQzogTm8gUmVjdXJzaW9uIF0KICAqIEEgcGFyc2VkIGVudGl0eSBtdXN0IG5vdCBjb250YWluIGEgcmVjdXJzaXZlCi0gKiByZWZlcmVuY2UgdG8gaXRzZWxmLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gCisgKiByZWZlcmVuY2UgdG8gaXRzZWxmLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KICAqCiAgKiBbIFdGQzogRW50aXR5IERlY2xhcmVkIF0KICAqIEluIGEgZG9jdW1lbnQgd2l0aG91dCBhbnkgRFRELCBhIGRvY3VtZW50IHdpdGggb25seSBhbiBpbnRlcm5hbCBEVEQKQEAgLTY4NjYsNjcgKzc2MjEsNzcgQEAKICAgICBpZiAoKHN0ciA9PSBOVUxMKSB8fCAoKnN0ciA9PSBOVUxMKSkgcmV0dXJuKE5VTEwpOwogICAgIHB0ciA9ICpzdHI7CiAgICAgY3VyID0gKnB0cjsKLSAgICBpZiAoY3VyID09ICclJykgewotICAgICAgICBwdHIrKzsKLQljdXIgPSAqcHRyOwotICAgICAgICBuYW1lID0geG1sUGFyc2VTdHJpbmdOYW1lKGN0eHQsICZwdHIpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9OQU1FX1JFUVVJUkVELAotCQkJICAgInhtbFBhcnNlU3RyaW5nUEVSZWZlcmVuY2U6IG5vIG5hbWVcbiIpOworICAgIGlmIChjdXIgIT0gJyUnKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgcHRyKys7CisgICAgY3VyID0gKnB0cjsKKyAgICBuYW1lID0geG1sUGFyc2VTdHJpbmdOYW1lKGN0eHQsICZwdHIpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKwl4bWxGYXRhbEVyck1zZyhjdHh0LCBYTUxfRVJSX05BTUVfUkVRVUlSRUQsCisJCSAgICAgICAieG1sUGFyc2VTdHJpbmdQRVJlZmVyZW5jZTogbm8gbmFtZVxuIik7CisJKnN0ciA9IHB0cjsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGN1ciA9ICpwdHI7CisgICAgaWYgKGN1ciAhPSAnOycpIHsKKwl4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VOVElUWVJFRl9TRU1JQ09MX01JU1NJTkcsIE5VTEwpOworCXhtbEZyZWUobmFtZSk7CisJKnN0ciA9IHB0cjsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHB0cisrOworCisgICAgLyoKKyAgICAgKiBJbmNyZWF0ZSB0aGUgbnVtYmVyIG9mIGVudGl0eSByZWZlcmVuY2VzIHBhcnNlZAorICAgICAqLworICAgIGN0eHQtPm5iZW50aXRpZXMrKzsKKworICAgIC8qCisgICAgICogUmVxdWVzdCB0aGUgZW50aXR5IGZyb20gU0FYCisgICAgICovCisgICAgaWYgKChjdHh0LT5zYXggIT0gTlVMTCkgJiYKKwkoY3R4dC0+c2F4LT5nZXRQYXJhbWV0ZXJFbnRpdHkgIT0gTlVMTCkpCisJZW50aXR5ID0gY3R4dC0+c2F4LT5nZXRQYXJhbWV0ZXJFbnRpdHkoY3R4dC0+dXNlckRhdGEsCisJCQkJCSAgICAgICBuYW1lKTsKKyAgICBpZiAoZW50aXR5ID09IE5VTEwpIHsKKwkvKgorCSAqIFsgV0ZDOiBFbnRpdHkgRGVjbGFyZWQgXQorCSAqIEluIGEgZG9jdW1lbnQgd2l0aG91dCBhbnkgRFRELCBhIGRvY3VtZW50IHdpdGggb25seSBhbgorCSAqIGludGVybmFsIERURCBzdWJzZXQgd2hpY2ggY29udGFpbnMgbm8gcGFyYW1ldGVyIGVudGl0eQorCSAqIHJlZmVyZW5jZXMsIG9yIGEgZG9jdW1lbnQgd2l0aCAic3RhbmRhbG9uZT0neWVzJyIsIC4uLgorCSAqIC4uLiBUaGUgZGVjbGFyYXRpb24gb2YgYSBwYXJhbWV0ZXIgZW50aXR5IG11c3QgcHJlY2VkZQorCSAqIGFueSByZWZlcmVuY2UgdG8gaXQuLi4KKwkgKi8KKwlpZiAoKGN0eHQtPnN0YW5kYWxvbmUgPT0gMSkgfHwKKwkgICAgKChjdHh0LT5oYXNFeHRlcm5hbFN1YnNldCA9PSAwKSAmJiAoY3R4dC0+aGFzUEVyZWZzID09IDApKSkgeworCSAgICB4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX1VOREVDTEFSRURfRU5USVRZLAorCQkgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsIG5hbWUpOwogCX0gZWxzZSB7Ci0JICAgIGN1ciA9ICpwdHI7Ci0JICAgIGlmIChjdXIgPT0gJzsnKSB7Ci0JCXB0cisrOwotCQljdXIgPSAqcHRyOwotCQlpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJgotCQkgICAgKGN0eHQtPnNheC0+Z2V0UGFyYW1ldGVyRW50aXR5ICE9IE5VTEwpKQotCQkgICAgZW50aXR5ID0gY3R4dC0+c2F4LT5nZXRQYXJhbWV0ZXJFbnRpdHkoY3R4dC0+dXNlckRhdGEsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQkJaWYgKGVudGl0eSA9PSBOVUxMKSB7Ci0JCSAgICAvKgotCQkgICAgICogWyBXRkM6IEVudGl0eSBEZWNsYXJlZCBdCi0JCSAgICAgKiBJbiBhIGRvY3VtZW50IHdpdGhvdXQgYW55IERURCwgYSBkb2N1bWVudCB3aXRoIG9ubHkgYW4KLQkJICAgICAqIGludGVybmFsIERURCBzdWJzZXQgd2hpY2ggY29udGFpbnMgbm8gcGFyYW1ldGVyIGVudGl0eQotCQkgICAgICogcmVmZXJlbmNlcywgb3IgYSBkb2N1bWVudCB3aXRoICJzdGFuZGFsb25lPSd5ZXMnIiwgLi4uCi0JCSAgICAgKiAuLi4gVGhlIGRlY2xhcmF0aW9uIG9mIGEgcGFyYW1ldGVyIGVudGl0eSBtdXN0IHByZWNlZGUKLQkJICAgICAqIGFueSByZWZlcmVuY2UgdG8gaXQuLi4KLQkJICAgICAqLwotCQkgICAgaWYgKChjdHh0LT5zdGFuZGFsb25lID09IDEpIHx8Ci0JCQkoKGN0eHQtPmhhc0V4dGVybmFsU3Vic2V0ID09IDApICYmCi0JCQkgKGN0eHQtPmhhc1BFcmVmcyA9PSAwKSkpIHsKLQkJCXhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5ERUNMQVJFRF9FTlRJVFksCi0JCQkgICAgICJQRVJlZmVyZW5jZTogJSUlczsgbm90IGZvdW5kXG4iLCBuYW1lKTsKLQkJICAgIH0gZWxzZSB7Ci0JCQkvKgotCQkJICogWyBWQzogRW50aXR5IERlY2xhcmVkIF0KLQkJCSAqIEluIGEgZG9jdW1lbnQgd2l0aCBhbiBleHRlcm5hbCBzdWJzZXQgb3IgZXh0ZXJuYWwKLQkJCSAqIHBhcmFtZXRlciBlbnRpdGllcyB3aXRoICJzdGFuZGFsb25lPSdubyciLCAuLi4KLQkJCSAqIC4uLiBUaGUgZGVjbGFyYXRpb24gb2YgYSBwYXJhbWV0ZXIgZW50aXR5IG11c3QKLQkJCSAqIHByZWNlZGUgYW55IHJlZmVyZW5jZSB0byBpdC4uLgotCQkJICovCi0JCQl4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFksCi0JCQkJICAgICAgIlBFUmVmZXJlbmNlOiAlJSVzOyBub3QgZm91bmRcbiIsCi0JCQkgICAgICAgICAgICAgIG5hbWUsIE5VTEwpOwotCQkJY3R4dC0+dmFsaWQgPSAwOwotCQkgICAgfQotCQl9IGVsc2UgewotCQkgICAgLyoKLQkJICAgICAqIEludGVybmFsIGNoZWNraW5nIGluIGNhc2UgdGhlIGVudGl0eSBxdWVzdCBiYXJmZWQKLQkJICAgICAqLwotCQkgICAgaWYgKChlbnRpdHktPmV0eXBlICE9IFhNTF9JTlRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSAmJgotCQkgICAgICAgIChlbnRpdHktPmV0eXBlICE9IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSkgewotCQkJeG1sV2FybmluZ01zZyhjdHh0LCBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZLAotCQkJICAgICAgICAgICAgICAiJSUlczsgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eVxuIiwKLQkJCQkgICAgICBuYW1lLCBOVUxMKTsKLQkJICAgIH0KLQkJfQotCQljdHh0LT5oYXNQRXJlZnMgPSAxOwotCSAgICB9IGVsc2UgewotCQl4bWxGYXRhbEVycihjdHh0LCBYTUxfRVJSX0VOVElUWVJFRl9TRU1JQ09MX01JU1NJTkcsIE5VTEwpOwotCSAgICB9Ci0JICAgIHhtbEZyZWUobmFtZSk7CisJICAgIC8qCisJICAgICAqIFsgVkM6IEVudGl0eSBEZWNsYXJlZCBdCisJICAgICAqIEluIGEgZG9jdW1lbnQgd2l0aCBhbiBleHRlcm5hbCBzdWJzZXQgb3IgZXh0ZXJuYWwKKwkgICAgICogcGFyYW1ldGVyIGVudGl0aWVzIHdpdGggInN0YW5kYWxvbmU9J25vJyIsIC4uLgorCSAgICAgKiAuLi4gVGhlIGRlY2xhcmF0aW9uIG9mIGEgcGFyYW1ldGVyIGVudGl0eSBtdXN0CisJICAgICAqIHByZWNlZGUgYW55IHJlZmVyZW5jZSB0byBpdC4uLgorCSAgICAgKi8KKwkgICAgeG1sV2FybmluZ01zZyhjdHh0LCBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZLAorCQkJICAiUEVSZWZlcmVuY2U6ICUlJXM7IG5vdCBmb3VuZFxuIiwKKwkJCSAgbmFtZSwgTlVMTCk7CisJICAgIGN0eHQtPnZhbGlkID0gMDsKKwl9CisgICAgfSBlbHNlIHsKKwkvKgorCSAqIEludGVybmFsIGNoZWNraW5nIGluIGNhc2UgdGhlIGVudGl0eSBxdWVzdCBiYXJmZWQKKwkgKi8KKwlpZiAoKGVudGl0eS0+ZXR5cGUgIT0gWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkpICYmCisJICAgIChlbnRpdHktPmV0eXBlICE9IFhNTF9FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZKSkgeworCSAgICB4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFksCisJCQkgICIlJSVzOyBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5XG4iLAorCQkJICBuYW1lLCBOVUxMKTsKIAl9CiAgICAgfQorICAgIGN0eHQtPmhhc1BFcmVmcyA9IDE7CisgICAgeG1sRnJlZShuYW1lKTsKICAgICAqc3RyID0gcHRyOwogICAgIHJldHVybihlbnRpdHkpOwogfQpAQCAtNzQwMywzOCArODE2OCw2IEBACiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBjb25zdCB4bWxDaGFyICoKLXhtbFBhcnNlTkNOYW1lQ29tcGxleCh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLSAgICBpbnQgbGVuID0gMCwgbDsKLSAgICBpbnQgYzsKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgLyoKLSAgICAgKiBIYW5kbGVyIGZvciBtb3JlIGNvbXBsZXggY2FzZXMKLSAgICAgKi8KLSAgICBHUk9XOwotICAgIGMgPSBDVVJfQ0hBUihsKTsKLSAgICBpZiAoKGMgPT0gJyAnKSB8fCAoYyA9PSAnPicpIHx8IChjID09ICcvJykgfHwgLyogYWNjZWxlcmF0b3JzICovCi0JKCFJU19MRVRURVIoYykgJiYgKGMgIT0gJ18nKSkpIHsKLQlyZXR1cm4oTlVMTCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKChjICE9ICcgJykgJiYgKGMgIT0gJz4nKSAmJiAoYyAhPSAnLycpICYmIC8qIHRlc3QgYmlnbmFtZS54bWwgKi8KLQkgICAoKElTX0xFVFRFUihjKSkgfHwgKElTX0RJR0lUKGMpKSB8fAotICAgICAgICAgICAgKGMgPT0gJy4nKSB8fCAoYyA9PSAnLScpIHx8IChjID09ICdfJykgfHwKLQkgICAgKElTX0NPTUJJTklORyhjKSkgfHwKLQkgICAgKElTX0VYVEVOREVSKGMpKSkpIHsKLQlpZiAoY291bnQrKyA+IDEwMCkgewotCSAgICBjb3VudCA9IDA7Ci0JICAgIEdST1c7Ci0JfQotCWxlbiArPSBsOwotCU5FWFRMKGwpOwotCWMgPSBDVVJfQ0hBUihsKTsKLSAgICB9Ci0gICAgcmV0dXJuKHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgY3R4dC0+aW5wdXQtPmN1ciAtIGxlbiwgbGVuKSk7Ci19Ci0KIC8qCiAgKiB4bWxHZXROYW1lc3BhY2U6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dApAQCAtNzQ2MCw1NiArODE5Myw2IEBACiB9CiAKIC8qKgotICogeG1sUGFyc2VOQ05hbWU6Ci0gKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAotICogQGxlbjogIGxlbmdodCBvZiB0aGUgc3RyaW5nIHBhcnNlZAotICoKLSAqIHBhcnNlIGFuIFhNTCBuYW1lLgotICoKLSAqIFs0TlNdIE5DTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwKLSAqICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcgotICoKLSAqIFs1TlNdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJykgKE5DTmFtZUNoYXIpKgotICoKLSAqIFJldHVybnMgdGhlIE5hbWUgcGFyc2VkIG9yIE5VTEwKLSAqLwotCi1zdGF0aWMgY29uc3QgeG1sQ2hhciAqCi14bWxQYXJzZU5DTmFtZSh4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLSAgICBjb25zdCB4bWxDaGFyICppbjsKLSAgICBjb25zdCB4bWxDaGFyICpyZXQ7Ci0gICAgaW50IGNvdW50ID0gMDsKLQotICAgIC8qCi0gICAgICogQWNjZWxlcmF0b3IgZm9yIHNpbXBsZSBBU0NJSSBuYW1lcwotICAgICAqLwotICAgIGluID0gY3R4dC0+aW5wdXQtPmN1cjsKLSAgICBpZiAoKCgqaW4gPj0gMHg2MSkgJiYgKCppbiA8PSAweDdBKSkgfHwKLQkoKCppbiA+PSAweDQxKSAmJiAoKmluIDw9IDB4NUEpKSB8fAotCSgqaW4gPT0gJ18nKSkgewotCWluKys7Ci0Jd2hpbGUgKCgoKmluID49IDB4NjEpICYmICgqaW4gPD0gMHg3QSkpIHx8Ci0JICAgICAgICgoKmluID49IDB4NDEpICYmICgqaW4gPD0gMHg1QSkpIHx8Ci0JICAgICAgICgoKmluID49IDB4MzApICYmICgqaW4gPD0gMHgzOSkpIHx8Ci0JICAgICAgICgqaW4gPT0gJ18nKSB8fCAoKmluID09ICctJykgfHwKLQkgICAgICAgKCppbiA9PSAnLicpKQotCSAgICBpbisrOwotCWlmICgoKmluID4gMCkgJiYgKCppbiA8IDB4ODApKSB7Ci0JICAgIGNvdW50ID0gaW4gLSBjdHh0LT5pbnB1dC0+Y3VyOwotCSAgICByZXQgPSB4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIGN0eHQtPmlucHV0LT5jdXIsIGNvdW50KTsKLQkgICAgY3R4dC0+aW5wdXQtPmN1ciA9IGluOwotCSAgICBjdHh0LT5uYkNoYXJzICs9IGNvdW50OwotCSAgICBjdHh0LT5pbnB1dC0+Y29sICs9IGNvdW50OwotCSAgICBpZiAocmV0ID09IE5VTEwpIHsKLQkgICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCBOVUxMKTsKLQkgICAgfQotCSAgICByZXR1cm4ocmV0KTsKLQl9Ci0gICAgfQotICAgIHJldHVybih4bWxQYXJzZU5DTmFtZUNvbXBsZXgoY3R4dCkpOwotfQotCi0vKioKICAqIHhtbFBhcnNlUU5hbWU6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dAogICogQHByZWZpeDogIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHByZWZpeCBwYXJ0CkBAIC03NTUxLDcgKzgyMzQsMTMgQEAKIAogICAgICAgICAgICAgeG1sTnNFcnIoY3R4dCwgWE1MX05TX0VSUl9RTkFNRSwKIAkgICAgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSBRTmFtZSAnJXM6J1xuIiwgcCwgTlVMTCwgTlVMTCk7Ci0JICAgIHRtcCA9IHhtbEJ1aWxkUU5hbWUoQkFEX0NBU1QgIiIsIHAsIE5VTEwsIDApOworCSAgICBsID0geG1sUGFyc2VObXRva2VuKGN0eHQpOworCSAgICBpZiAobCA9PSBOVUxMKQorCQl0bXAgPSB4bWxCdWlsZFFOYW1lKEJBRF9DQVNUICIiLCBwLCBOVUxMLCAwKTsKKwkgICAgZWxzZSB7CisJCXRtcCA9IHhtbEJ1aWxkUU5hbWUobCwgcCwgTlVMTCwgMCk7CisJCXhtbEZyZWUoKGNoYXIgKilsKTsKKwkgICAgfQogCSAgICBwID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCB0bXAsIC0xKTsKIAkgICAgaWYgKHRtcCAhPSBOVUxMKSB4bWxGcmVlKHRtcCk7CiAJICAgICpwcmVmaXggPSBOVUxMOwpAQCAtNzgxMSw5ICs4NTAwLDEwIEBACiAKIHN0YXRpYyBjb25zdCB4bWxDaGFyICoKIHhtbFBhcnNlQXR0cmlidXRlMih4bWxQYXJzZXJDdHh0UHRyIGN0eHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqcHJlZiwgY29uc3QgeG1sQ2hhciAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICoqcHJlZml4LCB4bWxDaGFyICoqdmFsdWUsCi0JCSAgIGludCAqbGVuLCBpbnQgKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHByZWYsIGNvbnN0IHhtbENoYXIgKiBlbGVtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiogcHJlZml4LCB4bWxDaGFyICoqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgIGludCAqbGVuLCBpbnQgKmFsbG9jKQorewogICAgIGNvbnN0IHhtbENoYXIgKm5hbWU7CiAgICAgeG1sQ2hhciAqdmFsLCAqaW50ZXJuYWxfdmFsID0gTlVMTDsKICAgICBpbnQgbm9ybWFsaXplID0gMDsKQEAgLTc4MjIsOSArODUxMiw5IEBACiAgICAgR1JPVzsKICAgICBuYW1lID0geG1sUGFyc2VRTmFtZShjdHh0LCBwcmVmaXgpOwogICAgIGlmIChuYW1lID09IE5VTEwpIHsKLQl4bWxGYXRhbEVyck1zZyhjdHh0LCBYTUxfRVJSX05BTUVfUkVRVUlSRUQsCi0JICAgICAgICAgICAgICAgImVycm9yIHBhcnNpbmcgYXR0cmlidXRlIG5hbWVcbiIpOwotICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgIHhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfTkFNRV9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHBhcnNpbmcgYXR0cmlidXRlIG5hbWVcbiIpOworICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIH0KIAogICAgIC8qCkBAIC03ODM0LDggKzg1MjQsOSBAQAogICAgICAgICBpbnQgdHlwZTsKIAogICAgICAgICB0eXBlID0gKGludCkgKGxvbmcpIHhtbEhhc2hRTG9va3VwMihjdHh0LT5hdHRzU3BlY2lhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmLCBlbGVtLCAqcHJlZml4LCBuYW1lKTsKLQlpZiAodHlwZSAhPSAwKSBub3JtYWxpemUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmLCBlbGVtLCAqcHJlZml4LCBuYW1lKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gMCkKKyAgICAgICAgICAgIG5vcm1hbGl6ZSA9IDE7CiAgICAgfQogCiAgICAgLyoKQEAgLTc4NDQsNTQgKzg1MzUsNzEgQEAKICAgICBTS0lQX0JMQU5LUzsKICAgICBpZiAoUkFXID09ICc9JykgewogICAgICAgICBORVhUOwotCVNLSVBfQkxBTktTOwotCXZhbCA9IHhtbFBhcnNlQXR0VmFsdWVJbnRlcm5hbChjdHh0LCBsZW4sIGFsbG9jLCBub3JtYWxpemUpOwotCWN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7CisgICAgICAgIFNLSVBfQkxBTktTOworICAgICAgICB2YWwgPSB4bWxQYXJzZUF0dFZhbHVlSW50ZXJuYWwoY3R4dCwgbGVuLCBhbGxvYywgbm9ybWFsaXplKTsKKwlpZiAobm9ybWFsaXplKSB7CisJICAgIC8qCisJICAgICAqIFNvbWV0aW1lcyBhIHNlY29uZCBub3JtYWxpc2F0aW9uIHBhc3MgZm9yIHNwYWNlcyBpcyBuZWVkZWQKKwkgICAgICogYnV0IHRoYXQgb25seSBoYXBwZW5zIGlmIGNoYXJyZWZzIG9yIGVudGl0aWVzIHJlZmVybmNlcworCSAgICAgKiBoYXZlIGJlZW4gdXNlZCBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLCBpLmUuIHRoZSBhdHRyaWJ1dGUKKwkgICAgICogdmFsdWUgaGF2ZSBiZWVuIGV4dHJhY3RlZCBpbiBhbiBhbGxvY2F0ZWQgc3RyaW5nIGFscmVhZHkuCisJICAgICAqLworCSAgICBpZiAoKmFsbG9jKSB7CisJICAgICAgICBjb25zdCB4bWxDaGFyICp2YWwyOworCisJICAgICAgICB2YWwyID0geG1sQXR0ck5vcm1hbGl6ZVNwYWNlMihjdHh0LCB2YWwsIGxlbik7CisJCWlmICgodmFsMiAhPSBOVUxMKSAmJiAodmFsMiAhPSB2YWwpKSB7CisJCSAgICB4bWxGcmVlKHZhbCk7CisJCSAgICB2YWwgPSAoeG1sQ2hhciAqKSB2YWwyOworCQl9CisJICAgIH0KKwl9CisgICAgICAgIGN0eHQtPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7CiAgICAgfSBlbHNlIHsKLQl4bWxGYXRhbEVyck1zZ1N0cihjdHh0LCBYTUxfRVJSX0FUVFJJQlVURV9XSVRIT1VUX1ZBTFVFLAotCSAgICAgICAiU3BlY2lmaWNhdGlvbiBtYW5kYXRlIHZhbHVlIGZvciBhdHRyaWJ1dGUgJXNcbiIsIG5hbWUpOwotCXJldHVybihOVUxMKTsKKyAgICAgICAgeG1sRmF0YWxFcnJNc2dTdHIoY3R4dCwgWE1MX0VSUl9BVFRSSUJVVEVfV0lUSE9VVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZmljYXRpb24gbWFuZGF0ZSB2YWx1ZSBmb3IgYXR0cmlidXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICB9CiAKLQlpZiAoKnByZWZpeCA9PSBjdHh0LT5zdHJfeG1sKSB7Ci0JCS8qCi0JCSAqIENoZWNrIHRoYXQgeG1sOmxhbmcgY29uZm9ybXMgdG8gdGhlIHNwZWNpZmljYXRpb24KLQkJICogTm8gbW9yZSByZWdpc3RlcmVkIGFzIGFuIGVycm9yLCBqdXN0IGdlbmVyYXRlIGEgd2FybmluZyBub3cKLQkJICogc2luY2UgdGhpcyB3YXMgZGVwcmVjYXRlZCBpbiBYTUwgc2Vjb25kIGVkaXRpb24KLQkJICovCi0JCWlmICgoY3R4dC0+cGVkYW50aWMpICYmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAibGFuZyIpKSkgewotCQkJaW50ZXJuYWxfdmFsID0geG1sU3RybmR1cCh2YWwsICpsZW4pOwotCQkJaWYgKCF4bWxDaGVja0xhbmd1YWdlSUQoaW50ZXJuYWxfdmFsKSkgewotCQkJCXhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9MQU5HX1ZBTFVFLAotCQkJCQkJICAiTWFsZm9ybWVkIHZhbHVlIGZvciB4bWw6bGFuZyA6ICVzXG4iLAotCQkJCQkgIGludGVybmFsX3ZhbCwgTlVMTCk7Ci0JCQl9Ci0JCX0KKyAgICBpZiAoKnByZWZpeCA9PSBjdHh0LT5zdHJfeG1sKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoYXQgeG1sOmxhbmcgY29uZm9ybXMgdG8gdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgICogTm8gbW9yZSByZWdpc3RlcmVkIGFzIGFuIGVycm9yLCBqdXN0IGdlbmVyYXRlIGEgd2FybmluZyBub3cKKyAgICAgICAgICogc2luY2UgdGhpcyB3YXMgZGVwcmVjYXRlZCBpbiBYTUwgc2Vjb25kIGVkaXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY3R4dC0+cGVkYW50aWMpICYmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAibGFuZyIpKSkgeworICAgICAgICAgICAgaW50ZXJuYWxfdmFsID0geG1sU3RybmR1cCh2YWwsICpsZW4pOworICAgICAgICAgICAgaWYgKCF4bWxDaGVja0xhbmd1YWdlSUQoaW50ZXJuYWxfdmFsKSkgeworICAgICAgICAgICAgICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9MQU5HX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCB2YWx1ZSBmb3IgeG1sOmxhbmcgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX3ZhbCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKgotCQkgKiBDaGVjayB0aGF0IHhtbDpzcGFjZSBjb25mb3JtcyB0byB0aGUgc3BlY2lmaWNhdGlvbgotCQkgKi8KLQkJaWYgKHhtbFN0ckVxdWFsKG5hbWUsIEJBRF9DQVNUICJzcGFjZSIpKSB7Ci0JCQlpbnRlcm5hbF92YWwgPSB4bWxTdHJuZHVwKHZhbCwgKmxlbik7Ci0JCQlpZiAoeG1sU3RyRXF1YWwoaW50ZXJuYWxfdmFsLCBCQURfQ0FTVCAiZGVmYXVsdCIpKQotCQkJCSooY3R4dC0+c3BhY2UpID0gMDsKLQkJCWVsc2UgaWYgKHhtbFN0ckVxdWFsKGludGVybmFsX3ZhbCwgQkFEX0NBU1QgInByZXNlcnZlIikpCi0JCQkJKihjdHh0LT5zcGFjZSkgPSAxOwotCQkJZWxzZSB7Ci0JCQkJeG1sV2FybmluZ01zZyhjdHh0LCBYTUxfV0FSX1NQQUNFX1ZBTFVFLAotIkludmFsaWQgdmFsdWUgXCIlc1wiIGZvciB4bWw6c3BhY2UgOiBcImRlZmF1bHRcIiBvciBcInByZXNlcnZlXCIgZXhwZWN0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF92YWwsIE5VTEwpOwotCQkJfQotCQl9Ci0JCWlmIChpbnRlcm5hbF92YWwpIHsKLQkJCXhtbEZyZWUoaW50ZXJuYWxfdmFsKTsKLQkJfQotCX0KKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhhdCB4bWw6c3BhY2UgY29uZm9ybXMgdG8gdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAic3BhY2UiKSkgeworICAgICAgICAgICAgaW50ZXJuYWxfdmFsID0geG1sU3RybmR1cCh2YWwsICpsZW4pOworICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKGludGVybmFsX3ZhbCwgQkFEX0NBU1QgImRlZmF1bHQiKSkKKyAgICAgICAgICAgICAgICAqKGN0eHQtPnNwYWNlKSA9IDA7CisgICAgICAgICAgICBlbHNlIGlmICh4bWxTdHJFcXVhbChpbnRlcm5hbF92YWwsIEJBRF9DQVNUICJwcmVzZXJ2ZSIpKQorICAgICAgICAgICAgICAgICooY3R4dC0+c3BhY2UpID0gMTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9TUEFDRV9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIFwiJXNcIiBmb3IgeG1sOnNwYWNlIDogXCJkZWZhdWx0XCIgb3IgXCJwcmVzZXJ2ZVwiIGV4cGVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfdmFsLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJuYWxfdmFsKSB7CisgICAgICAgICAgICB4bWxGcmVlKGludGVybmFsX3ZhbCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICAqdmFsdWUgPSB2YWw7Ci0gICAgcmV0dXJuKG5hbWUpOworICAgIHJldHVybiAobmFtZSk7CiB9Ci0KIC8qKgogICogeG1sUGFyc2VTdGFydFRhZzI6CiAgKiBAY3R4dDogIGFuIFhNTCBwYXJzZXIgY29udGV4dApAQCAtODAwMywxNyArODcxMSwzMyBAQAogICAgICAgICAgICAgICAgIGlmICgqVVJMICE9IDApIHsKIAkJICAgIHVyaSA9IHhtbFBhcnNlVVJJKChjb25zdCBjaGFyICopIFVSTCk7CiAJCSAgICBpZiAodXJpID09IE5VTEwpIHsKLQkJCXhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9OU19VUkksCi0JCQkJICAgICAgInhtbG5zOiAlcyBub3QgYSB2YWxpZCBVUklcbiIsCi0JCQkJICAgICAgVVJMLCBOVUxMKTsKKwkJCXhtbE5zRXJyKGN0eHQsIFhNTF9XQVJfTlNfVVJJLAorCQkJICAgICAgICAgInhtbG5zOiAnJXMnIGlzIG5vdCBhIHZhbGlkIFVSSVxuIiwKKwkJCQkJICAgVVJMLCBOVUxMLCBOVUxMKTsKIAkJICAgIH0gZWxzZSB7CiAJCQlpZiAodXJpLT5zY2hlbWUgPT0gTlVMTCkgewotCQkJICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9OU19VUklfUkVMQVRJVkUsCi0JCQkJICAgInhtbG5zOiBVUkkgJXMgaXMgbm90IGFic29sdXRlXG4iLAotCQkJCSAgICAgICAgICBVUkwsIE5VTEwpOworCQkJICAgIHhtbE5zV2FybihjdHh0LCBYTUxfV0FSX05TX1VSSV9SRUxBVElWRSwKKwkJCQkgICAgICAieG1sbnM6IFVSSSAlcyBpcyBub3QgYWJzb2x1dGVcbiIsCisJCQkJICAgICAgVVJMLCBOVUxMLCBOVUxMKTsKIAkJCX0KIAkJCXhtbEZyZWVVUkkodXJpKTsKIAkJICAgIH0KKwkJICAgIGlmIChVUkwgPT0gY3R4dC0+c3RyX3htbF9ucykgeworCQkJaWYgKGF0dG5hbWUgIT0gY3R4dC0+c3RyX3htbCkgeworCQkJICAgIHhtbE5zRXJyKGN0eHQsIFhNTF9OU19FUlJfWE1MX05BTUVTUEFDRSwKKwkJCSAieG1sIG5hbWVzcGFjZSBVUkkgY2Fubm90IGJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZVxuIiwKKwkJCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCQkJfQorCQkJZ290byBza2lwX2RlZmF1bHRfbnM7CisJCSAgICB9CisJCSAgICBpZiAoKGxlbiA9PSAyOSkgJiYKKwkJCSh4bWxTdHJFcXVhbChVUkwsCisJCQkJIEJBRF9DQVNUICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpKSkgeworCQkJeG1sTnNFcnIoY3R4dCwgWE1MX05TX0VSUl9YTUxfTkFNRVNQQUNFLAorCQkJICAgICAicmV1c2Ugb2YgdGhlIHhtbG5zIG5hbWVzcGFjZSBuYW1lIGlzIGZvcmJpZGRlblxuIiwKKwkJCQkgTlVMTCwgTlVMTCwgTlVMTCk7CisJCQlnb3RvIHNraXBfZGVmYXVsdF9uczsKKwkJICAgIH0KIAkJfQogCQkvKgogCQkgKiBjaGVjayB0aGF0IGl0J3Mgbm90IGEgZGVmaW5lZCBuYW1lc3BhY2UKQEAgLTgwMjUsNiArODc0OSw3IEBACiAJCSAgICB4bWxFcnJBdHRyaWJ1dGVEdXAoY3R4dCwgTlVMTCwgYXR0bmFtZSk7CiAJCWVsc2UKIAkJICAgIGlmIChuc1B1c2goY3R4dCwgTlVMTCwgVVJMKSA+IDApIG5iTnMrKzsKK3NraXBfZGVmYXVsdF9uczoKIAkJaWYgKGFsbG9jICE9IDApIHhtbEZyZWUoYXR0dmFsdWUpOwogCQlTS0lQX0JMQU5LUzsKIAkJY29udGludWU7CkBAIC04MDQyLDIyICs4NzY3LDQ5IEBACiAJCSAgICAvKgogCQkgICAgICogRG8gbm90IGtlZXAgYSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBub2RlCiAJCSAgICAgKi8KLQkJICAgIGlmIChhbGxvYyAhPSAwKSB4bWxGcmVlKGF0dHZhbHVlKTsKLQkJICAgIFNLSVBfQkxBTktTOwotCQkgICAgY29udGludWU7CisJCSAgICBnb3RvIHNraXBfbnM7CiAJCX0KLQkJdXJpID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgVVJMKTsKLQkJaWYgKHVyaSA9PSBOVUxMKSB7Ci0JCSAgICB4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfTlNfVVJJLAotCQkJICJ4bWxuczolczogJyVzJyBpcyBub3QgYSB2YWxpZCBVUklcbiIsCi0JCQkJICAgICAgIGF0dG5hbWUsIFVSTCk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoKGN0eHQtPnBlZGFudGljKSAmJiAodXJpLT5zY2hlbWUgPT0gTlVMTCkpIHsKLQkJCXhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9OU19VUklfUkVMQVRJVkUsCi0JCQkJICAgICAgInhtbG5zOiVzOiBVUkkgJXMgaXMgbm90IGFic29sdXRlXG4iLAotCQkJICAgICAgICAgICAgICBhdHRuYW1lLCBVUkwpOworICAgICAgICAgICAgICAgIGlmIChVUkwgPT0gY3R4dC0+c3RyX3htbF9ucykgeworCQkgICAgaWYgKGF0dG5hbWUgIT0gY3R4dC0+c3RyX3htbCkgeworCQkgICAgICAgIHhtbE5zRXJyKGN0eHQsIFhNTF9OU19FUlJfWE1MX05BTUVTUEFDRSwKKwkJCSAgICAgICAgICJ4bWwgbmFtZXNwYWNlIFVSSSBtYXBwZWQgdG8gd3JvbmcgcHJlZml4XG4iLAorCQkJICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCSAgICB9Ci0JCSAgICB4bWxGcmVlVVJJKHVyaSk7CisJCSAgICBnb3RvIHNraXBfbnM7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoYXR0bmFtZSA9PSBjdHh0LT5zdHJfeG1sbnMpIHsKKwkJICAgIHhtbE5zRXJyKGN0eHQsIFhNTF9OU19FUlJfWE1MX05BTUVTUEFDRSwKKwkJCSAgICAgInJlZGVmaW5pdGlvbiBvZiB0aGUgeG1sbnMgcHJlZml4IGlzIGZvcmJpZGRlblxuIiwKKwkJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJCSAgICBnb3RvIHNraXBfbnM7CisJCX0KKwkJaWYgKChsZW4gPT0gMjkpICYmCisJCSAgICAoeG1sU3RyRXF1YWwoVVJMLAorCQkgICAgICAgICAgICAgICAgIEJBRF9DQVNUICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpKSkgeworCQkgICAgeG1sTnNFcnIoY3R4dCwgWE1MX05TX0VSUl9YTUxfTkFNRVNQQUNFLAorCQkJICAgICAicmV1c2Ugb2YgdGhlIHhtbG5zIG5hbWVzcGFjZSBuYW1lIGlzIGZvcmJpZGRlblxuIiwKKwkJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJCSAgICBnb3RvIHNraXBfbnM7CisJCX0KKwkJaWYgKChVUkwgPT0gTlVMTCkgfHwgKFVSTFswXSA9PSAwKSkgeworCQkgICAgeG1sTnNFcnIoY3R4dCwgWE1MX05TX0VSUl9YTUxfTkFNRVNQQUNFLAorCQkgICAgICAgICAgICAgInhtbG5zOiVzOiBFbXB0eSBYTUwgbmFtZXNwYWNlIGlzIG5vdCBhbGxvd2VkXG4iLAorCQkJICAgICAgICAgIGF0dG5hbWUsIE5VTEwsIE5VTEwpOworCQkgICAgZ290byBza2lwX25zOworCQl9IGVsc2UgeworCQkgICAgdXJpID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgVVJMKTsKKwkJICAgIGlmICh1cmkgPT0gTlVMTCkgeworCQkJeG1sTnNFcnIoY3R4dCwgWE1MX1dBUl9OU19VUkksCisJCQkgICAgICJ4bWxuczolczogJyVzJyBpcyBub3QgYSB2YWxpZCBVUklcbiIsCisJCQkJCSAgIGF0dG5hbWUsIFVSTCwgTlVMTCk7CisJCSAgICB9IGVsc2UgeworCQkJaWYgKChjdHh0LT5wZWRhbnRpYykgJiYgKHVyaS0+c2NoZW1lID09IE5VTEwpKSB7CisJCQkgICAgeG1sTnNXYXJuKGN0eHQsIFhNTF9XQVJfTlNfVVJJX1JFTEFUSVZFLAorCQkJCSAgICAgICJ4bWxuczolczogVVJJICVzIGlzIG5vdCBhYnNvbHV0ZVxuIiwKKwkJCQkgICAgICBhdHRuYW1lLCBVUkwsIE5VTEwpOworCQkJfQorCQkJeG1sRnJlZVVSSSh1cmkpOworCQkgICAgfQogCQl9CiAKIAkJLyoKQEAgLTgwNzAsNiArODgyMiw3IEBACiAJCSAgICB4bWxFcnJBdHRyaWJ1dGVEdXAoY3R4dCwgYXByZWZpeCwgYXR0bmFtZSk7CiAJCWVsc2UKIAkJICAgIGlmIChuc1B1c2goY3R4dCwgYXR0bmFtZSwgVVJMKSA+IDApIG5iTnMrKzsKK3NraXBfbnM6CiAJCWlmIChhbGxvYyAhPSAwKSB4bWxGcmVlKGF0dHZhbHVlKTsKIAkJU0tJUF9CTEFOS1M7CiAJCWlmIChjdHh0LT5pbnB1dC0+YmFzZSAhPSBiYXNlKSBnb3RvIGJhc2VfY2hhbmdlZDsKQEAgLTgxMDQsNyArODg1Nyw3IEBACiAJCXhtbEZyZWUoYXR0dmFsdWUpOwogCX0KIAotZmFpbGVkOiAgICAgCitmYWlsZWQ6CiAKIAlHUk9XCiAJaWYgKGN0eHQtPmlucHV0LT5iYXNlICE9IGJhc2UpIGdvdG8gYmFzZV9jaGFuZ2VkOwpAQCAtODEzNSw4ICs4ODg4LDggQEAKIAlkZWZhdWx0cyA9IHhtbEhhc2hMb29rdXAyKGN0eHQtPmF0dHNEZWZhdWx0LCBsb2NhbG5hbWUsIHByZWZpeCk7CiAJaWYgKGRlZmF1bHRzICE9IE5VTEwpIHsKIAkgICAgZm9yIChpID0gMDtpIDwgZGVmYXVsdHMtPm5iQXR0cnM7aSsrKSB7Ci0JICAgICAgICBhdHRuYW1lID0gZGVmYXVsdHMtPnZhbHVlc1s0ICogaV07Ci0JCWFwcmVmaXggPSBkZWZhdWx0cy0+dmFsdWVzWzQgKiBpICsgMV07CisJICAgICAgICBhdHRuYW1lID0gZGVmYXVsdHMtPnZhbHVlc1s1ICogaV07CisJCWFwcmVmaXggPSBkZWZhdWx0cy0+dmFsdWVzWzUgKiBpICsgMV07CiAKICAgICAgICAgICAgICAgICAvKgogCQkgKiBzcGVjaWFsIHdvcmsgZm9yIG5hbWVzcGFjZXMgZGVmYXVsdGVkIGRlZnMKQEAgLTgxNTEsOSArODkwNCw5IEBACiAJICAgICAgICAgICAgaWYgKGogPD0gbmJOcykgY29udGludWU7CiAKIAkJICAgIG5zbmFtZSA9IHhtbEdldE5hbWVzcGFjZShjdHh0LCBOVUxMKTsKLQkJICAgIGlmIChuc25hbWUgIT0gZGVmYXVsdHMtPnZhbHVlc1s0ICogaSArIDJdKSB7CisJCSAgICBpZiAobnNuYW1lICE9IGRlZmF1bHRzLT52YWx1ZXNbNSAqIGkgKyAyXSkgewogCQkJaWYgKG5zUHVzaChjdHh0LCBOVUxMLAotCQkJICAgICAgICAgICBkZWZhdWx0cy0+dmFsdWVzWzQgKiBpICsgMl0pID4gMCkKKwkJCSAgICAgICAgICAgZGVmYXVsdHMtPnZhbHVlc1s1ICogaSArIDJdKSA+IDApCiAJCQkgICAgbmJOcysrOwogCQkgICAgfQogCQl9IGVsc2UgaWYgKGFwcmVmaXggPT0gY3R4dC0+c3RyX3htbG5zKSB7CkBAIC04MTY4LDcgKzg5MjEsNyBAQAogCQkgICAgbnNuYW1lID0geG1sR2V0TmFtZXNwYWNlKGN0eHQsIGF0dG5hbWUpOwogCQkgICAgaWYgKG5zbmFtZSAhPSBkZWZhdWx0cy0+dmFsdWVzWzJdKSB7CiAJCQlpZiAobnNQdXNoKGN0eHQsIGF0dG5hbWUsCi0JCQkgICAgICAgICAgIGRlZmF1bHRzLT52YWx1ZXNbNCAqIGkgKyAyXSkgPiAwKQorCQkJICAgICAgICAgICBkZWZhdWx0cy0+dmFsdWVzWzUgKiBpICsgMl0pID4gMCkKIAkJCSAgICBuYk5zKys7CiAJCSAgICB9CiAJCX0gZWxzZSB7CkBAIC04MTk0LDggKzg5NDcsMTQgQEAKIAkJCWF0dHNbbmJhdHRzKytdID0gTlVMTDsKIAkJICAgIGVsc2UKIAkJICAgICAgICBhdHRzW25iYXR0cysrXSA9IHhtbEdldE5hbWVzcGFjZShjdHh0LCBhcHJlZml4KTsKLQkJICAgIGF0dHNbbmJhdHRzKytdID0gZGVmYXVsdHMtPnZhbHVlc1s0ICogaSArIDJdOwotCQkgICAgYXR0c1tuYmF0dHMrK10gPSBkZWZhdWx0cy0+dmFsdWVzWzQgKiBpICsgM107CisJCSAgICBhdHRzW25iYXR0cysrXSA9IGRlZmF1bHRzLT52YWx1ZXNbNSAqIGkgKyAyXTsKKwkJICAgIGF0dHNbbmJhdHRzKytdID0gZGVmYXVsdHMtPnZhbHVlc1s1ICogaSArIDNdOworCQkgICAgaWYgKChjdHh0LT5zdGFuZGFsb25lID09IDEpICYmCisJCSAgICAgICAgKGRlZmF1bHRzLT52YWx1ZXNbNSAqIGkgKyA0XSAhPSBOVUxMKSkgeworCQkJeG1sVmFsaWRpdHlFcnJvcihjdHh0LCBYTUxfRFREX1NUQU5EQUxPTkVfREVGQVVMVEVELCAKKwkgICJzdGFuZGFsb25lOiBhdHRyaWJ1dGUgJXMgb24gJXMgZGVmYXVsdGVkIGZyb20gZXh0ZXJuYWwgc3Vic2V0XG4iLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dG5hbWUsIGxvY2FsbmFtZSk7CisJCSAgICB9CiAJCSAgICBuYmRlZisrOwogCQl9CiAJICAgIH0KQEAgLTg1NzgsMTAgKzkzMzcsMTEgQEAKICAgICB4bWxOb2RlUHRyIHJldDsKICAgICBpbnQgbnNOciA9IGN0eHQtPm5zTnI7CiAKLSAgICBpZiAoKHVuc2lnbmVkIGludCkgY3R4dC0+bmFtZU5yID4geG1sUGFyc2VyTWF4RGVwdGgpIHsKLSAgICAgICAgeG1sRmF0YWxFcnJNc2dJbnQoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKLQkgICAgICAiRXhjZXNzaXZlIGRlcHRoIGluIGRvY3VtZW50OiBjaGFuZ2UgeG1sUGFyc2VyTWF4RGVwdGggPSAlZFxuIiwKLQkgICAgICAgICAgICAgICAgICB4bWxQYXJzZXJNYXhEZXB0aCk7CisgICAgaWYgKCgodW5zaWduZWQgaW50KSBjdHh0LT5uYW1lTnIgPiB4bWxQYXJzZXJNYXhEZXB0aCkgJiYKKyAgICAgICAgKChjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX0hVR0UpID09IDApKSB7CisJeG1sRmF0YWxFcnJNc2dJbnQoY3R4dCwgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKKwkJICJFeGNlc3NpdmUgZGVwdGggaW4gZG9jdW1lbnQ6ICVkIHVzZSBYTUxfUEFSU0VfSFVHRSBvcHRpb25cbiIsCisJCQkgIHhtbFBhcnNlck1heERlcHRoKTsKIAljdHh0LT5pbnN0YXRlID0gWE1MX1BBUlNFUl9FT0Y7CiAJcmV0dXJuOwogICAgIH0KQEAgLTg3MzUsNyArOTQ5NSw5IEBACiAgKgogICogcGFyc2UgdGhlIFhNTCB2ZXJzaW9uIHZhbHVlLgogICoKLSAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsKKyAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gJzEuJyBbMC05XSsKKyAqCisgKiBJbiBwcmFjdGljZSBhbGxvdyBbMC05XS5bMC05XSsgYXQgdGhhdCBsZXZlbAogICoKICAqIFJldHVybnMgdGhlIHN0cmluZyBnaXZpbmcgdGhlIFhNTCB2ZXJzaW9uIG51bWJlciwgb3IgTlVMTAogICovCkBAIC04NzUyLDE3ICs5NTE0LDI4IEBACiAJcmV0dXJuKE5VTEwpOwogICAgIH0KICAgICBjdXIgPSBDVVI7Ci0gICAgd2hpbGUgKCgoY3VyID49ICdhJykgJiYgKGN1ciA8PSAneicpKSB8fAotICAgICAgICAgICAoKGN1ciA+PSAnQScpICYmIChjdXIgPD0gJ1onKSkgfHwKLSAgICAgICAgICAgKChjdXIgPj0gJzAnKSAmJiAoY3VyIDw9ICc5JykpIHx8Ci0gICAgICAgICAgIChjdXIgPT0gJ18nKSB8fCAoY3VyID09ICcuJykgfHwKLQkgICAoY3VyID09ICc6JykgfHwgKGN1ciA9PSAnLScpKSB7CisgICAgaWYgKCEoKGN1ciA+PSAnMCcpICYmIChjdXIgPD0gJzknKSkpIHsKKwl4bWxGcmVlKGJ1Zik7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBidWZbbGVuKytdID0gY3VyOworICAgIE5FWFQ7CisgICAgY3VyPUNVUjsKKyAgICBpZiAoY3VyICE9ICcuJykgeworCXhtbEZyZWUoYnVmKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIGJ1ZltsZW4rK10gPSBjdXI7CisgICAgTkVYVDsKKyAgICBjdXI9Q1VSOworICAgIHdoaWxlICgoY3VyID49ICcwJykgJiYgKGN1ciA8PSAnOScpKSB7CiAJaWYgKGxlbiArIDEgPj0gc2l6ZSkgewogCSAgICB4bWxDaGFyICp0bXA7CiAKIAkgICAgc2l6ZSAqPSAyOwogCSAgICB0bXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKGJ1Ziwgc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAJICAgIGlmICh0bXAgPT0gTlVMTCkgeworCSAgICAgICAgeG1sRnJlZShidWYpOwogCQl4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CiAJCXJldHVybihOVUxMKTsKIAkgICAgfQpAQCAtODc3OSwxMSArOTU1MiwxMSBAQAogLyoqCiAgKiB4bWxQYXJzZVZlcnNpb25JbmZvOgogICogQGN0eHQ6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKLSAqIAorICoKICAqIHBhcnNlIHRoZSBYTUwgdmVyc2lvbi4KICAqCiAgKiBbMjRdIFZlcnNpb25JbmZvIDo6PSBTICd2ZXJzaW9uJyBFcSAoJyBWZXJzaW9uTnVtICcgfCAiIFZlcnNpb25OdW0gIikKLSAqIAorICoKICAqIFsyNV0gRXEgOjo9IFM/ICc9JyBTPwogICoKICAqIFJldHVybnMgdGhlIHZlcnNpb24gc3RyaW5nLCBlLmcuICIxLjAiCkBAIC04ODQ4LDcgKzk2MjEsNyBAQAogCSAgICB4bWxFcnJNZW1vcnkoY3R4dCwgTlVMTCk7CiAJICAgIHJldHVybihOVUxMKTsKIAl9Ci0JCisKIAlidWZbbGVuKytdID0gY3VyOwogCU5FWFQ7CiAJY3VyID0gQ1VSOwpAQCAtODkzNiw2ICs5NzA5LDE4IEBACiAgICAgICAgIGlmICgoZW5jb2RpbmcgIT0gTlVMTCkgJiYKIAkgICAgKCgheG1sU3RyY2FzZWNtcChlbmNvZGluZywgQkFEX0NBU1QgIlVURi0xNiIpKSB8fAogCSAgICAgKCF4bWxTdHJjYXNlY21wKGVuY29kaW5nLCBCQURfQ0FTVCAiVVRGMTYiKSkpKSB7CisJICAgIC8qCisJICAgICAqIElmIG5vIGVuY29kaW5nIHdhcyBwYXNzZWQgdG8gdGhlIHBhcnNlciwgdGhhdCB3ZSBhcmUKKwkgICAgICogdXNpbmcgVVRGLTE2IGFuZCBubyBkZWNvZGVyIGlzIHByZXNlbnQgaS5lLiB0aGUgCisJICAgICAqIGRvY3VtZW50IGlzIGFwcGFyZW50bHkgVVRGLTggY29tcGF0aWJsZSwgdGhlbiByYWlzZSBhbgorCSAgICAgKiBlbmNvZGluZyBtaXNtYXRjaCBmYXRhbCBlcnJvcgorCSAgICAgKi8KKwkgICAgaWYgKChjdHh0LT5lbmNvZGluZyA9PSBOVUxMKSAmJgorCSAgICAgICAgKGN0eHQtPmlucHV0LT5idWYgIT0gTlVMTCkgJiYKKwkgICAgICAgIChjdHh0LT5pbnB1dC0+YnVmLT5lbmNvZGVyID09IE5VTEwpKSB7CisJCXhtbEZhdGFsRXJyTXNnKGN0eHQsIFhNTF9FUlJfSU5WQUxJRF9FTkNPRElORywKKwkJICAiRG9jdW1lbnQgbGFiZWxsZWQgVVRGLTE2IGJ1dCBoYXMgVVRGLTggY29udGVudFxuIik7CisJICAgIH0KIAkgICAgaWYgKGN0eHQtPmVuY29kaW5nICE9IE5VTEwpCiAJCXhtbEZyZWUoKHhtbENoYXIgKikgY3R4dC0+ZW5jb2RpbmcpOwogCSAgICBjdHh0LT5lbmNvZGluZyA9IGVuY29kaW5nOwpAQCAtOTA5NCwxMSArOTg3OSwyMyBAQAogICAgIH0gZWxzZSB7CiAJaWYgKCF4bWxTdHJFcXVhbCh2ZXJzaW9uLCAoY29uc3QgeG1sQ2hhciAqKSBYTUxfREVGQVVMVF9WRVJTSU9OKSkgewogCSAgICAvKgotCSAgICAgKiBUT0RPOiBCbHVlYmVycnkgc2hvdWxkIGJlIGRldGVjdGVkIGhlcmUKKwkgICAgICogQ2hhbmdlZCBoZXJlIGZvciBYTUwtMS4wIDV0aCBlZGl0aW9uCiAJICAgICAqLwotCSAgICB4bWxXYXJuaW5nTXNnKGN0eHQsIFhNTF9XQVJfVU5LTk9XTl9WRVJTSU9OLAotCQkgICAgICAgICAgIlVuc3VwcG9ydGVkIHZlcnNpb24gJyVzJ1xuIiwKLQkJCSAgdmVyc2lvbiwgTlVMTCk7CisJICAgIGlmIChjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX09MRDEwKSB7CisJCXhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5LTk9XTl9WRVJTSU9OLAorCQkJICAgICAgICAgICJVbnN1cHBvcnRlZCB2ZXJzaW9uICclcydcbiIsCisJCQkgICAgICAgICAgdmVyc2lvbik7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBpZiAoKHZlcnNpb25bMF0gPT0gJzEnKSAmJiAoKHZlcnNpb25bMV0gPT0gJy4nKSkpIHsKKwkJICAgIHhtbFdhcm5pbmdNc2coY3R4dCwgWE1MX1dBUl9VTktOT1dOX1ZFUlNJT04sCisJCSAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCB2ZXJzaW9uICclcydcbiIsCisJCQkJICB2ZXJzaW9uLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJICAgIHhtbEZhdGFsRXJyTXNnU3RyKGN0eHQsIFhNTF9FUlJfVU5LTk9XTl9WRVJTSU9OLAorCQkJCSAgICAgICJVbnN1cHBvcnRlZCB2ZXJzaW9uICclcydcbiIsCisJCQkJICAgICAgdmVyc2lvbik7CisJCX0KKwkgICAgfQogCX0KIAlpZiAoY3R4dC0+dmVyc2lvbiAhPSBOVUxMKQogCSAgICB4bWxGcmVlKCh2b2lkICopIGN0eHQtPnZlcnNpb24pOwpAQCAtOTMzMiw2ICsxMDEyOSwxNSBAQAogCWN0eHQtPm15RG9jID0gTlVMTDsKICAgICB9CiAKKyAgICBpZiAoKGN0eHQtPndlbGxGb3JtZWQpICYmIChjdHh0LT5teURvYyAhPSBOVUxMKSkgeworICAgICAgICBjdHh0LT5teURvYy0+cHJvcGVydGllcyB8PSBYTUxfRE9DX1dFTExGT1JNRUQ7CisJaWYgKGN0eHQtPnZhbGlkKQorCSAgICBjdHh0LT5teURvYy0+cHJvcGVydGllcyB8PSBYTUxfRE9DX0RURFZBTElEOworCWlmIChjdHh0LT5uc1dlbGxGb3JtZWQpCisJICAgIGN0eHQtPm15RG9jLT5wcm9wZXJ0aWVzIHw9IFhNTF9ET0NfTlNWQUxJRDsKKwlpZiAoY3R4dC0+b3B0aW9ucyAmIFhNTF9QQVJTRV9PTEQxMCkKKwkgICAgY3R4dC0+bXlEb2MtPnByb3BlcnRpZXMgfD0gWE1MX0RPQ19PTEQxMDsKKyAgICB9CiAgICAgaWYgKCEgY3R4dC0+d2VsbEZvcm1lZCkgewogCWN0eHQtPnZhbGlkID0gMDsKIAlyZXR1cm4oLTEpOwpAQCAtMTAxNjMsNyArMTA5NjksMjAgQEAKIAkJCWN0eHQtPmlucHV0LT5jdXIgKz0gdG1wOwogCQkJZ290byBlbmNvZGluZ19lcnJvcjsKIAkJICAgIH0KLQkJICAgIGlmICgoY3R4dC0+c2F4ICE9IE5VTEwpICYmIChiYXNlID4gMCkgJiYKKwkJICAgIGlmICgoY3R4dC0+c2F4ICE9IE5VTEwpICYmIChiYXNlID09IDApICYmCisJCSAgICAgICAgKGN0eHQtPnNheC0+Y2RhdGFCbG9jayAhPSBOVUxMKSAmJgorCQkgICAgICAgICghY3R4dC0+ZGlzYWJsZVNBWCkpIHsKKwkJCS8qCisJCQkgKiBTcGVjaWFsIGNhc2UgdG8gcHJvdmlkZSBpZGVudGljYWwgYmVoYXZpb3VyCisJCQkgKiBiZXR3ZWVuIHB1bGwgYW5kIHB1c2ggcGFyc2VycyBvbiBlbnB0eSBDREFUQQorCQkJICogc2VjdGlvbnMKKwkJCSAqLworCQkJIGlmICgoY3R4dC0+aW5wdXQtPmN1ciAtIGN0eHQtPmlucHV0LT5iYXNlID49IDkpICYmCisJCQkgICAgICghc3RybmNtcCgoY29uc3QgY2hhciAqKSZjdHh0LT5pbnB1dC0+Y3VyWy05XSwKKwkJCSAgICAgICAgICAgICAgICI8IVtDREFUQVsiLCA5KSkpCisJCQkgICAgIGN0eHQtPnNheC0+Y2RhdGFCbG9jayhjdHh0LT51c2VyRGF0YSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBRF9DQVNUICIiLCAwKTsKKwkJICAgIH0gZWxzZSBpZiAoKGN0eHQtPnNheCAhPSBOVUxMKSAmJiAoYmFzZSA+IDApICYmCiAJCQkoIWN0eHQtPmRpc2FibGVTQVgpKSB7CiAJCQlpZiAoY3R4dC0+c2F4LT5jZGF0YUJsb2NrICE9IE5VTEwpCiAJCQkgICAgY3R4dC0+c2F4LT5jZGF0YUJsb2NrKGN0eHQtPnVzZXJEYXRhLApAQCAtMTA5NjMsNyArMTE3ODIsMTEgQEAKICAgICAvKgogICAgICAqIHBsdWcgc29tZSBlbmNvZGluZyBjb252ZXJzaW9uIHJvdXRpbmVzIGhlcmUuCiAgICAgICovCi0gICAgeG1sUHVzaElucHV0KGN0eHQsIHBpbnB1dCk7CisgICAgaWYgKHhtbFB1c2hJbnB1dChjdHh0LCBwaW5wdXQpIDwgMCkgeworICAgICAgICBpZiAoc2F4ICE9IE5VTEwpIGN0eHQtPnNheCA9IE5VTEw7CisJeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7CisJcmV0dXJuKE5VTEwpOworICAgIH0KICAgICBpZiAoZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpIHsKICAgICAgICAgeG1sU3dpdGNoRW5jb2RpbmcoY3R4dCwgZW5jKTsKICAgICB9CkBAIC0xMDk4MCw2ICsxMTgwMywxMSBAQAogICAgICAqLwogICAgIGN0eHQtPmluU3Vic2V0ID0gMjsKICAgICBjdHh0LT5teURvYyA9IHhtbE5ld0RvYyhCQURfQ0FTVCAiMS4wIik7CisgICAgaWYgKGN0eHQtPm15RG9jID09IE5VTEwpIHsKKwl4bWxFcnJNZW1vcnkoY3R4dCwgIk5ldyBEb2MgZmFpbGVkIik7CisJcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBjdHh0LT5teURvYy0+cHJvcGVydGllcyA9IFhNTF9ET0NfSU5URVJOQUw7CiAgICAgY3R4dC0+bXlEb2MtPmV4dFN1YnNldCA9IHhtbE5ld0R0ZChjdHh0LT5teURvYywgQkFEX0NBU1QgIm5vbmUiLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAibm9uZSIsIEJBRF9DQVNUICJub25lIik7CiAKQEAgLTExMDkyLDcgKzExOTIwLDEzIEBACiAgICAgLyoKICAgICAgKiBwbHVnIHNvbWUgZW5jb2RpbmcgY29udmVyc2lvbiByb3V0aW5lcyBoZXJlLgogICAgICAqLwotICAgIHhtbFB1c2hJbnB1dChjdHh0LCBpbnB1dCk7CisgICAgaWYgKHhtbFB1c2hJbnB1dChjdHh0LCBpbnB1dCkgPCAwKSB7CisgICAgICAgIGlmIChzYXggIT0gTlVMTCkgY3R4dC0+c2F4ID0gTlVMTDsKKwl4bWxGcmVlUGFyc2VyQ3R4dChjdHh0KTsKKwlpZiAoc3lzdGVtSWRDYW5vbmljICE9IE5VTEwpCisJICAgIHhtbEZyZWUoc3lzdGVtSWRDYW5vbmljKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQogICAgIGlmICgoY3R4dC0+aW5wdXQtPmVuZCAtIGN0eHQtPmlucHV0LT5jdXIpID49IDQpIHsKIAllbmMgPSB4bWxEZXRlY3RDaGFyRW5jb2RpbmcoY3R4dC0+aW5wdXQtPmN1ciwgNCk7CiAJeG1sU3dpdGNoRW5jb2RpbmcoY3R4dCwgZW5jKTsKQEAgLTExMTEzLDYgKzExOTQ3LDEzIEBACiAgICAgICovCiAgICAgY3R4dC0+aW5TdWJzZXQgPSAyOwogICAgIGN0eHQtPm15RG9jID0geG1sTmV3RG9jKEJBRF9DQVNUICIxLjAiKTsKKyAgICBpZiAoY3R4dC0+bXlEb2MgPT0gTlVMTCkgeworCXhtbEVyck1lbW9yeShjdHh0LCAiTmV3IERvYyBmYWlsZWQiKTsKKyAgICAgICAgaWYgKHNheCAhPSBOVUxMKSBjdHh0LT5zYXggPSBOVUxMOworCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOworCXJldHVybihOVUxMKTsKKyAgICB9CisgICAgY3R4dC0+bXlEb2MtPnByb3BlcnRpZXMgPSBYTUxfRE9DX0lOVEVSTkFMOwogICAgIGN0eHQtPm15RG9jLT5leHRTdWJzZXQgPSB4bWxOZXdEdGQoY3R4dC0+bXlEb2MsIEJBRF9DQVNUICJub25lIiwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxJRCwgU3lzdGVtSUQpOwogICAgIHhtbFBhcnNlRXh0ZXJuYWxTdWJzZXQoY3R4dCwgRXh0ZXJuYWxJRCwgU3lzdGVtSUQpOwpAQCAtMTExMzksNyArMTE5ODAsNyBAQAogICAgIH0KICAgICBpZiAoc2F4ICE9IE5VTEwpIGN0eHQtPnNheCA9IE5VTEw7CiAgICAgeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7Ci0gICAgCisKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTExNTAsNyArMTE5OTEsNyBAQAogICogQFN5c3RlbUlEOiAgYSBOQU1FKiBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIERURAogICoKICAqIExvYWQgYW5kIHBhcnNlIGFuIGV4dGVybmFsIHN1YnNldC4KLSAqIAorICoKICAqIFJldHVybnMgdGhlIHJlc3VsdGluZyB4bWxEdGRQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogICovCiAKQEAgLTExMTk4LDcgKzEyMDM5LDggQEAKIAogICAgIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuKC0xKTsKIAotICAgIGlmIChjdHgtPmRlcHRoID4gNDApIHsKKyAgICBpZiAoKChjdHgtPmRlcHRoID4gNDApICYmICgoY3R4LT5vcHRpb25zICYgWE1MX1BBUlNFX0hVR0UpID09IDApKSB8fAorICAgICAgICAoY3R4LT5kZXB0aCA+IDEwMjQpKSB7CiAJcmV0dXJuKFhNTF9FUlJfRU5USVRZX0xPT1ApOwogICAgIH0KIApAQCAtMTEyMTMsMTAgKzEyMDU1LDEwIEBACiAgICAgaWYgKGN0eHQgPT0gTlVMTCkgewogCXJldHVybigtMSk7CiAgICAgfQotICAgIAorCiAgICAgY3R4dC0+dXNlckRhdGEgPSBjdHh0OwogICAgIGN0eHQtPl9wcml2YXRlID0gY3R4LT5fcHJpdmF0ZTsKLSAgICAKKwogICAgIGlucHV0U3RyZWFtID0geG1sTG9hZEV4dGVybmFsRW50aXR5KChjaGFyICopVVJMLCAoY2hhciAqKUlELCBjdHh0KTsKICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gTlVMTCkgewogCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwpAQCAtMTEyMjksNyArMTIwNzEsNyBAQAogCWRpcmVjdG9yeSA9IHhtbFBhcnNlckdldERpcmVjdG9yeSgoY2hhciAqKVVSTCk7CiAgICAgaWYgKChjdHh0LT5kaXJlY3RvcnkgPT0gTlVMTCkgJiYgKGRpcmVjdG9yeSAhPSBOVUxMKSkKIAljdHh0LT5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7Ci0gICAgCisKICAgICBvbGRzYXggPSBjdHh0LT5zYXg7CiAgICAgY3R4dC0+c2F4ID0gY3R4LT5zYXg7CiAgICAgeG1sRGV0ZWN0U0FYMihjdHh0KTsKQEAgLTExMjM4LDYgKzEyMDgwLDcgQEAKIAl4bWxGcmVlUGFyc2VyQ3R4dChjdHh0KTsKIAlyZXR1cm4oLTEpOwogICAgIH0KKyAgICBuZXdEb2MtPnByb3BlcnRpZXMgPSBYTUxfRE9DX0lOVEVSTkFMOwogICAgIGlmIChjdHgtPm15RG9jLT5kaWN0KSB7CiAJbmV3RG9jLT5kaWN0ID0gY3R4LT5teURvYy0+ZGljdDsKIAl4bWxEaWN0UmVmZXJlbmNlKG5ld0RvYy0+ZGljdCk7CkBAIC0xMTI2Nyw3ICsxMjExMCw3IEBACiAJbmV3RG9jLT5jaGlsZHJlbi0+ZG9jID0gY3R4LT5teURvYzsKICAgICB9CiAKLSAgICAvKiAKKyAgICAvKgogICAgICAqIEdldCB0aGUgNCBmaXJzdCBieXRlcyBhbmQgZGVjb2RlIHRoZSBjaGFyc2V0CiAgICAgICogaWYgZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX05PTkUKICAgICAgKiBwbHVnIHNvbWUgZW5jb2RpbmcgY29udmVyc2lvbiByb3V0aW5lcy4KQEAgLTExMjg5LDYgKzEyMTMyLDE0IEBACiAgICAgICovCiAgICAgaWYgKChDTVA1KENVUl9QVFIsICc8JywgJz8nLCAneCcsICdtJywgJ2wnKSkgJiYgKElTX0JMQU5LX0NIKE5YVCg1KSkpKSB7CiAJeG1sUGFyc2VUZXh0RGVjbChjdHh0KTsKKwkvKgorCSAqIEFuIFhNTC0xLjAgZG9jdW1lbnQgY2FuJ3QgcmVmZXJlbmNlIGFuIGVudGl0eSBub3QgWE1MLTEuMAorCSAqLworCWlmICgoeG1sU3RyRXF1YWwoY3R4LT52ZXJzaW9uLCBCQURfQ0FTVCAiMS4wIikpICYmCisJICAgICgheG1sU3RyRXF1YWwoY3R4dC0+aW5wdXQtPnZlcnNpb24sIEJBRF9DQVNUICIxLjAiKSkpIHsKKwkgICAgeG1sRmF0YWxFcnJNc2coY3R4dCwgWE1MX0VSUl9WRVJTSU9OX01JU01BVENILCAKKwkgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gbWlzbWF0Y2ggYmV0d2VlbiBkb2N1bWVudCBhbmQgZW50aXR5XG4iKTsKKwl9CiAgICAgfQogCiAgICAgLyoKQEAgLTExMzIyLDcgKzEyMTczLDcgQEAKICAgICBjdHh0LT5saW5lbnVtYmVycyA9IGN0eC0+bGluZW51bWJlcnM7CiAKICAgICB4bWxQYXJzZUNvbnRlbnQoY3R4dCk7Ci0gICAKKwogICAgIGN0eC0+dmFsaWRhdGUgPSBjdHh0LT52YWxpZGF0ZTsKICAgICBjdHgtPnZhbGlkID0gY3R4dC0+dmFsaWQ7CiAgICAgaWYgKChSQVcgPT0gJzwnKSAmJiAoTlhUKDEpID09ICcvJykpIHsKQEAgLTExMzY1LDcgKzEyMjE2LDcgQEAKICAgICBuZXdEb2MtPmludFN1YnNldCA9IE5VTEw7CiAgICAgbmV3RG9jLT5leHRTdWJzZXQgPSBOVUxMOwogICAgIHhtbEZyZWVEb2MobmV3RG9jKTsKLSAgICAKKwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMTM5OSwxMiArMTIyNTAsMTIgQEAKICAgICB4bWxDaGFyIHN0YXJ0WzRdOwogICAgIHhtbENoYXJFbmNvZGluZyBlbmM7CiAKLSAgICBpZiAoZGVwdGggPiA0MCkgeworICAgIGlmICgoKGRlcHRoID4gNDApICYmCisJKChvbGRjdHh0ID09IE5VTEwpIHx8IChvbGRjdHh0LT5vcHRpb25zICYgWE1MX1BBUlNFX0hVR0UpID09IDApKSB8fAorCShkZXB0aCA+IDEwMjQpKSB7CiAJcmV0dXJuKFhNTF9FUlJfRU5USVRZX0xPT1ApOwogICAgIH0KIAotCi0KICAgICBpZiAobGlzdCAhPSBOVUxMKQogICAgICAgICAqbGlzdCA9IE5VTEw7CiAgICAgaWYgKChVUkwgPT0gTlVMTCkgJiYgKElEID09IE5VTEwpKQpAQCAtMTE0NTAsNiArMTIzMDEsNyBAQAogCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwogCXJldHVybihYTUxfRVJSX0lOVEVSTkFMX0VSUk9SKTsKICAgICB9CisgICAgbmV3RG9jLT5wcm9wZXJ0aWVzID0gWE1MX0RPQ19JTlRFUk5BTDsKICAgICBuZXdEb2MtPmludFN1YnNldCA9IGRvYy0+aW50U3Vic2V0OwogICAgIG5ld0RvYy0+ZXh0U3Vic2V0ID0gZG9jLT5leHRTdWJzZXQ7CiAgICAgbmV3RG9jLT5kaWN0ID0gZG9jLT5kaWN0OwpAQCAtMTE0NzYsNyArMTIzMjgsNyBAQAogICAgIGN0eHQtPm15RG9jID0gZG9jOwogICAgIG5ld1Jvb3QtPmRvYyA9IGRvYzsKIAotICAgIC8qIAorICAgIC8qCiAgICAgICogR2V0IHRoZSA0IGZpcnN0IGJ5dGVzIGFuZCBkZWNvZGUgdGhlIGNoYXJzZXQKICAgICAgKiBpZiBlbmMgIT0gWE1MX0NIQVJfRU5DT0RJTkdfTk9ORQogICAgICAqIHBsdWcgc29tZSBlbmNvZGluZyBjb252ZXJzaW9uIHJvdXRpbmVzLgpAQCAtMTE1MDQsNyArMTIzNTYsNyBAQAogICAgIGN0eHQtPmRlcHRoID0gZGVwdGg7CiAKICAgICB4bWxQYXJzZUNvbnRlbnQoY3R4dCk7Ci0gICAKKwogICAgIGlmICgoUkFXID09ICc8JykgJiYgKE5YVCgxKSA9PSAnLycpKSB7CiAJeG1sRmF0YWxFcnIoY3R4dCwgWE1MX0VSUl9OT1RfV0VMTF9CQUxBTkNFRCwgTlVMTCk7CiAgICAgfSBlbHNlIGlmIChSQVcgIT0gMCkgewpAQCAtMTE1MzcsNiArMTIzODksMjUgQEAKIAl9CiAJcmV0ID0gWE1MX0VSUl9PSzsKICAgICB9CisKKyAgICAvKgorICAgICAqIFJlY29yZCBpbiB0aGUgcGFyZW50IGNvbnRleHQgdGhlIG51bWJlciBvZiBlbnRpdGllcyByZXBsYWNlbWVudAorICAgICAqIGRvbmUgd2hlbiBwYXJzaW5nIHRoYXQgcmVmZXJlbmNlLgorICAgICAqLworICAgIG9sZGN0eHQtPm5iZW50aXRpZXMgKz0gY3R4dC0+bmJlbnRpdGllczsKKyAgICAvKgorICAgICAqIEFsc28gcmVjb3JkIHRoZSBzaXplIG9mIHRoZSBlbnRpdHkgcGFyc2VkCisgICAgICovCisgICAgaWYgKGN0eHQtPmlucHV0ICE9IE5VTEwpIHsKKwlvbGRjdHh0LT5zaXplZW50aXRpZXMgKz0gY3R4dC0+aW5wdXQtPmNvbnN1bWVkOworCW9sZGN0eHQtPnNpemVlbnRpdGllcyArPSAoY3R4dC0+aW5wdXQtPmN1ciAtIGN0eHQtPmlucHV0LT5iYXNlKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBBbmQgcmVjb3JkIHRoZSBsYXN0IGVycm9yIGlmIGFueQorICAgICAqLworICAgIGlmIChjdHh0LT5sYXN0RXJyb3IuY29kZSAhPSBYTUxfRVJSX09LKQorICAgICAgICB4bWxDb3B5RXJyb3IoJmN0eHQtPmxhc3RFcnJvciwgJm9sZGN0eHQtPmxhc3RFcnJvcik7CisKICAgICBpZiAoc2F4ICE9IE5VTEwpIAogCWN0eHQtPnNheCA9IG9sZHNheDsKICAgICBvbGRjdHh0LT5ub2RlX3NlcS5tYXhpbXVtID0gY3R4dC0+bm9kZV9zZXEubWF4aW11bTsKQEAgLTExNTQ5LDcgKzEyNDIwLDcgQEAKICAgICBuZXdEb2MtPmludFN1YnNldCA9IE5VTEw7CiAgICAgbmV3RG9jLT5leHRTdWJzZXQgPSBOVUxMOwogICAgIHhtbEZyZWVEb2MobmV3RG9jKTsKLSAgICAKKwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMTYyNiw5ICsxMjQ5Nyw5IEBACiAgKgogICogUmV0dXJucyBYTUxfRVJSX09LIGlmIHRoZSBjaHVuayBpcyB3ZWxsIGJhbGFuY2VkLCBhbmQgdGhlIHBhcnNlcgogICogZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqICAgIAorICoKICAqIEluIGNhc2UgcmVjb3ZlciBpcyBzZXQgdG8gMSwgdGhlIG5vZGVsaXN0IHdpbGwgbm90IGJlIGVtcHR5IGV2ZW4gaWYKLSAqIHRoZSBwYXJzZWQgY2h1bmsgaXMgbm90IHdlbGwgYmFsYW5jZWQuIAorICogdGhlIHBhcnNlZCBjaHVuayBpcyBub3Qgd2VsbCBiYWxhbmNlZC4KICAqLwogc3RhdGljIHhtbFBhcnNlckVycm9ycwogeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5SW50ZXJuYWwoeG1sUGFyc2VyQ3R4dFB0ciBvbGRjdHh0LApAQCAtMTE2NDIsNyArMTI1MTMsOCBAQAogICAgIGludCBzaXplOwogICAgIHhtbFBhcnNlckVycm9ycyByZXQgPSBYTUxfRVJSX09LOwogCi0gICAgaWYgKG9sZGN0eHQtPmRlcHRoID4gNDApIHsKKyAgICBpZiAoKChvbGRjdHh0LT5kZXB0aCA+IDQwKSAmJiAoKG9sZGN0eHQtPm9wdGlvbnMgJiBYTUxfUEFSU0VfSFVHRSkgPT0gMCkpIHx8CisgICAgICAgIChvbGRjdHh0LT5kZXB0aCA+ICAxMDI0KSkgewogCXJldHVybihYTUxfRVJSX0VOVElUWV9MT09QKTsKICAgICB9CiAKQEAgLTExNjcxLDcgKzEyNTQzLDcgQEAKICAgICB4bWxEZXRlY3RTQVgyKGN0eHQpOwogICAgIGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9IG9sZGN0eHQtPnJlcGxhY2VFbnRpdGllczsKICAgICBjdHh0LT5vcHRpb25zID0gb2xkY3R4dC0+b3B0aW9uczsKLSAgICAKKwogICAgIGN0eHQtPl9wcml2YXRlID0gb2xkY3R4dC0+X3ByaXZhdGU7CiAgICAgaWYgKG9sZGN0eHQtPm15RG9jID09IE5VTEwpIHsKIAluZXdEb2MgPSB4bWxOZXdEb2MoQkFEX0NBU1QgIjEuMCIpOwpAQCAtMTE2ODEsNiArMTI1NTMsNyBAQAogCSAgICB4bWxGcmVlUGFyc2VyQ3R4dChjdHh0KTsKIAkgICAgcmV0dXJuKFhNTF9FUlJfSU5URVJOQUxfRVJST1IpOwogCX0KKwluZXdEb2MtPnByb3BlcnRpZXMgPSBYTUxfRE9DX0lOVEVSTkFMOwogCW5ld0RvYy0+ZGljdCA9IGN0eHQtPmRpY3Q7CiAJeG1sRGljdFJlZmVyZW5jZShuZXdEb2MtPmRpY3QpOwogCWN0eHQtPm15RG9jID0gbmV3RG9jOwpAQCAtMTE3MzYsNyArMTI2MDksNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICByZXQgPSBYTUxfRVJSX09LOwogICAgIH0KLSAgICAKKwogICAgIGlmICgobHN0ICE9IE5VTEwpICYmIChyZXQgPT0gWE1MX0VSUl9PSykpIHsKIAl4bWxOb2RlUHRyIGN1cjsKIApAQCAtMTE3NjUsNyArMTI2MzgsMTggQEAKICAgICAgICAgY3R4dC0+bXlEb2MtPmNoaWxkcmVuID0gY29udGVudDsKICAgICAgICAgY3R4dC0+bXlEb2MtPmxhc3QgPSBsYXN0OwogICAgIH0KLQkKKworICAgIC8qCisgICAgICogUmVjb3JkIGluIHRoZSBwYXJlbnQgY29udGV4dCB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIHJlcGxhY2VtZW50CisgICAgICogZG9uZSB3aGVuIHBhcnNpbmcgdGhhdCByZWZlcmVuY2UuCisgICAgICovCisgICAgb2xkY3R4dC0+bmJlbnRpdGllcyArPSBjdHh0LT5uYmVudGl0aWVzOworICAgIC8qCisgICAgICogQWxzbyByZWNvcmQgdGhlIGxhc3QgZXJyb3IgaWYgYW55CisgICAgICovCisgICAgaWYgKGN0eHQtPmxhc3RFcnJvci5jb2RlICE9IFhNTF9FUlJfT0spCisgICAgICAgIHhtbENvcHlFcnJvcigmY3R4dC0+bGFzdEVycm9yLCAmb2xkY3R4dC0+bGFzdEVycm9yKTsKKwogICAgIGN0eHQtPnNheCA9IG9sZHNheDsKICAgICBjdHh0LT5kaWN0ID0gTlVMTDsKICAgICBjdHh0LT5hdHRzRGVmYXVsdCA9IE5VTEw7CkBAIC0xMTc3NCw3ICsxMjY1OCw3IEBACiAgICAgaWYgKG5ld0RvYyAhPSBOVUxMKSB7CiAJeG1sRnJlZURvYyhuZXdEb2MpOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMTg3NSw3ICsxMjc1OSw3IEBACiAgICAgfSBlbHNlCiAgICAgICAgIG9wdGlvbnMgfD0gWE1MX1BBUlNFX05PRElDVDsKIAotICAgIHhtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOworICAgIHhtbEN0eHRVc2VPcHRpb25zSW50ZXJuYWwoY3R4dCwgb3B0aW9ucywgTlVMTCk7CiAgICAgeG1sRGV0ZWN0U0FYMihjdHh0KTsKICAgICBjdHh0LT5teURvYyA9IGRvYzsKIApAQCAtMTE5MDcsNyArMTI3OTEsNyBAQAogCSAgICBjdXIgPSBjdXItPnBhcmVudDsKIAl9CiAJY3R4dC0+aW5zdGF0ZSA9IFhNTF9QQVJTRVJfQ09OVEVOVDsKLSAgICB9IAorICAgIH0KIAogICAgIGlmICgoY3R4dC0+dmFsaWRhdGUpIHx8IChjdHh0LT5yZXBsYWNlRW50aXRpZXMgIT0gMCkpIHsKIAkvKgpAQCAtMTE5NDIsMTIgKzEyODI2LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gWE1MX0VSUl9PSzsKICAgICB9Ci0gICAgCisKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBub2Rlc2V0IGFmdGVyIHVubGlua2luZyBpdCBmcm9tCiAgICAgICogdGhlIHBzZXVkbyBzaWJsaW5nLgogICAgICAqLwotICAgIAorCiAgICAgY3VyID0gZmFrZS0+bmV4dDsKICAgICBmYWtlLT5uZXh0ID0gTlVMTDsKICAgICBub2RlLT5sYXN0ID0gZmFrZTsKQEAgLTExOTc1LDcgKzEyODU5LDcgQEAKICAgICBpZiAoZG9jLT5kaWN0ICE9IE5VTEwpCiAgICAgICAgIGN0eHQtPmRpY3QgPSBOVUxMOwogICAgIHhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwotICAgIAorCiAgICAgcmV0dXJuKHJldCk7CiAjZWxzZSAvKiAhU0FYMiAqLwogICAgIHJldHVybihYTUxfRVJSX0lOVEVSTkFMX0VSUk9SKTsKQEAgLTEyMDAzLDEzICsxMjg4NywxNCBAQAogICoKICAqIFJldHVybnMgMCBpZiB0aGUgY2h1bmsgaXMgd2VsbCBiYWxhbmNlZCwgLTEgaW4gY2FzZSBvZiBhcmdzIHByb2JsZW0gYW5kCiAgKiAgICB0aGUgcGFyc2VyIGVycm9yIGNvZGUgb3RoZXJ3aXNlCi0gKiAgICAKKyAqCiAgKiBJbiBjYXNlIHJlY292ZXIgaXMgc2V0IHRvIDEsIHRoZSBub2RlbGlzdCB3aWxsIG5vdCBiZSBlbXB0eSBldmVuIGlmCi0gKiB0aGUgcGFyc2VkIGNodW5rIGlzIG5vdCB3ZWxsIGJhbGFuY2VkLiAKKyAqIHRoZSBwYXJzZWQgY2h1bmsgaXMgbm90IHdlbGwgYmFsYW5jZWQsIGFzc3VtaW5nIHRoZSBwYXJzaW5nIHN1Y2NlZWRlZCB0bworICogc29tZSBleHRlbnQuCiAgKi8KIGludAogeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3Zlcih4bWxEb2NQdHIgZG9jLCB4bWxTQVhIYW5kbGVyUHRyIHNheCwKLSAgICAgdm9pZCAqdXNlcl9kYXRhLCBpbnQgZGVwdGgsIGNvbnN0IHhtbENoYXIgKnN0cmluZywgeG1sTm9kZVB0ciAqbHN0LCAKKyAgICAgdm9pZCAqdXNlcl9kYXRhLCBpbnQgZGVwdGgsIGNvbnN0IHhtbENoYXIgKnN0cmluZywgeG1sTm9kZVB0ciAqbHN0LAogICAgICBpbnQgcmVjb3ZlcikgewogICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKICAgICB4bWxEb2NQdHIgbmV3RG9jOwpAQCAtMTIwNDQsNiArMTI5MjksNyBAQAogCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwogCXJldHVybigtMSk7CiAgICAgfQorICAgIG5ld0RvYy0+cHJvcGVydGllcyA9IFhNTF9ET0NfSU5URVJOQUw7CiAgICAgaWYgKChkb2MgIT0gTlVMTCkgJiYgKGRvYy0+ZGljdCAhPSBOVUxMKSkgewogICAgICAgICB4bWxEaWN0RnJlZShjdHh0LT5kaWN0KTsKIAljdHh0LT5kaWN0ID0gZG9jLT5kaWN0OwpAQCAtMTIwNTMsNyArMTI5MzksNyBAQAogCWN0eHQtPnN0cl94bWxfbnMgPSB4bWxEaWN0TG9va3VwKGN0eHQtPmRpY3QsIFhNTF9YTUxfTkFNRVNQQUNFLCAzNik7CiAJY3R4dC0+ZGljdE5hbWVzID0gMTsKICAgICB9IGVsc2UgewotCXhtbEN0eHRVc2VPcHRpb25zKGN0eHQsIFhNTF9QQVJTRV9OT0RJQ1QpOworCXhtbEN0eHRVc2VPcHRpb25zSW50ZXJuYWwoY3R4dCwgWE1MX1BBUlNFX05PRElDVCwgTlVMTCk7CiAgICAgfQogICAgIGlmIChkb2MgIT0gTlVMTCkgewogCW5ld0RvYy0+aW50U3Vic2V0ID0gZG9jLT5pbnRTdWJzZXQ7CkBAIC0xMjExNiw3ICsxMzAwMiw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgIHJldCA9IDA7CiAgICAgfQotICAgIAorCiAgICAgaWYgKChsc3QgIT0gTlVMTCkgJiYgKChyZXQgPT0gMCkgfHwgKHJlY292ZXIgPT0gMSkpKSB7CiAJeG1sTm9kZVB0ciBjdXI7CiAKQEAgLTEyMTMzLDE1ICsxMzAxOSwxNSBAQAogCX0KIAluZXdEb2MtPmNoaWxkcmVuLT5jaGlsZHJlbiA9IE5VTEw7CiAgICAgfQotCQotICAgIGlmIChzYXggIT0gTlVMTCkgCisKKyAgICBpZiAoc2F4ICE9IE5VTEwpCiAJY3R4dC0+c2F4ID0gb2xkc2F4OwogICAgIHhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwogICAgIG5ld0RvYy0+aW50U3Vic2V0ID0gTlVMTDsKICAgICBuZXdEb2MtPmV4dFN1YnNldCA9IE5VTEw7CiAgICAgbmV3RG9jLT5vbGROcyA9IE5VTEw7CiAgICAgeG1sRnJlZURvYyhuZXdEb2MpOwotICAgIAorCiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTEyMTg5LDcgKzEzMDc1LDcgQEAKICAgICBpZiAoc2F4ICE9IE5VTEwpCiAgICAgICAgIGN0eHQtPnNheCA9IE5VTEw7CiAgICAgeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7Ci0gICAgCisKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTIyMzEsNyArMTMxMTcsNyBAQAogICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0U3RyZWFtOwogICAgIGNoYXIgKmRpcmVjdG9yeSA9IE5VTEw7CiAgICAgeG1sQ2hhciAqdXJpOwotICAgIAorCiAgICAgY3R4dCA9IHhtbE5ld1BhcnNlckN0eHQoKTsKICAgICBpZiAoY3R4dCA9PSBOVUxMKSB7CiAJcmV0dXJuKE5VTEwpOwpAQCAtMTIyNzMsNyArMTMxNTksNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKLSAqIAkJRnJvbnQgZW5kcyB3aGVuIHBhcnNpbmcgZnJvbSBhIGZpbGUJCQkqCisgKgkJRnJvbnQgZW5kcyB3aGVuIHBhcnNpbmcgZnJvbSBhIGZpbGUJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEyMzAyLDkgKzEzMTg4LDkgQEAKICAgICB9CiAKICAgICBpZiAob3B0aW9ucykKLQl4bWxDdHh0VXNlT3B0aW9ucyhjdHh0LCBvcHRpb25zKTsKKwl4bWxDdHh0VXNlT3B0aW9uc0ludGVybmFsKGN0eHQsIG9wdGlvbnMsIE5VTEwpOwogICAgIGN0eHQtPmxpbmVudW1iZXJzID0gMTsKLSAgICAKKwogICAgIGlucHV0U3RyZWFtID0geG1sTG9hZEV4dGVybmFsRW50aXR5KGZpbGVuYW1lLCBOVUxMLCBjdHh0KTsKICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gTlVMTCkgewogCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwpAQCAtMTIzNjEsNyArMTMyNDcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY292ZXJ5LCB2b2lkICpkYXRhKSB7CiAgICAgeG1sRG9jUHRyIHJldDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7Ci0gICAgY2hhciAqZGlyZWN0b3J5ID0gTlVMTDsKIAogICAgIHhtbEluaXRQYXJzZXIoKTsKIApAQCAtMTIzNzksMTAgKzEzMjY0LDggQEAKIAljdHh0LT5fcHJpdmF0ZSA9IGRhdGE7CiAgICAgfQogCi0gICAgaWYgKChjdHh0LT5kaXJlY3RvcnkgPT0gTlVMTCkgJiYgKGRpcmVjdG9yeSA9PSBOVUxMKSkKLSAgICAgICAgZGlyZWN0b3J5ID0geG1sUGFyc2VyR2V0RGlyZWN0b3J5KGZpbGVuYW1lKTsKLSAgICBpZiAoKGN0eHQtPmRpcmVjdG9yeSA9PSBOVUxMKSAmJiAoZGlyZWN0b3J5ICE9IE5VTEwpKQotICAgICAgICBjdHh0LT5kaXJlY3RvcnkgPSAoY2hhciAqKSB4bWxTdHJkdXAoKHhtbENoYXIgKikgZGlyZWN0b3J5KTsKKyAgICBpZiAoY3R4dC0+ZGlyZWN0b3J5ID09IE5VTEwpCisgICAgICAgIGN0eHQtPmRpcmVjdG9yeSA9IHhtbFBhcnNlckdldERpcmVjdG9yeShmaWxlbmFtZSk7CiAKICAgICBjdHh0LT5yZWNvdmVyeSA9IHJlY292ZXJ5OwogCkBAIC0xMjQzNSw5ICsxMzMxOCwxMCBAQAogICogQGN1cjogIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyCiAgKgogICogcGFyc2UgYW4gWE1MIGluLW1lbW9yeSBkb2N1bWVudCBhbmQgYnVpbGQgYSB0cmVlLgotICogSW4gdGhlIGNhc2UgdGhlIGRvY3VtZW50IGlzIG5vdCBXZWxsIEZvcm1lZCwgYSB0cmVlIGlzIGJ1aWx0IGFueXdheQotICogCi0gKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgdHJlZQorICogSW4gdGhlIGNhc2UgdGhlIGRvY3VtZW50IGlzIG5vdCBXZWxsIEZvcm1lZCwgYSBhdHRlbXB0IHRvIGJ1aWxkIGEKKyAqIHRyZWUgaXMgdHJpZWQgYW55d2F5CisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHRyZWUgb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUKICAqLwogCiB4bWxEb2NQdHIKQEAgLTEyNDY3LDkgKzEzMzUxLDEwIEBACiAgKgogICogcGFyc2UgYW4gWE1MIGZpbGUgYW5kIGJ1aWxkIGEgdHJlZS4gQXV0b21hdGljIHN1cHBvcnQgZm9yIFpMSUIvQ29tcHJlc3MKICAqIGNvbXByZXNzZWQgZG9jdW1lbnQgaXMgcHJvdmlkZWQgYnkgZGVmYXVsdCBpZiBmb3VuZCBhdCBjb21waWxlLXRpbWUuCi0gKiBJbiB0aGUgY2FzZSB0aGUgZG9jdW1lbnQgaXMgbm90IFdlbGwgRm9ybWVkLCBhIHRyZWUgaXMgYnVpbHQgYW55d2F5CisgKiBJbiB0aGUgY2FzZSB0aGUgZG9jdW1lbnQgaXMgbm90IFdlbGwgRm9ybWVkLCBpdCBhdHRlbXB0cyB0byBidWlsZAorICogYSB0cmVlIGFueXdheQogICoKLSAqIFJldHVybnMgdGhlIHJlc3VsdGluZyBkb2N1bWVudCB0cmVlCisgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgdHJlZSBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZQogICovCiAKIHhtbERvY1B0cgpAQCAtMTI3MTEsOSArMTM1OTYsMTAgQEAKICAqIEBzaXplOiAgdGhlIHNpemUgb2YgdGhlIGFycmF5CiAgKgogICogcGFyc2UgYW4gWE1MIGluLW1lbW9yeSBibG9jayBhbmQgYnVpbGQgYSB0cmVlLgotICogSW4gdGhlIGNhc2UgdGhlIGRvY3VtZW50IGlzIG5vdCBXZWxsIEZvcm1lZCwgYSB0cmVlIGlzIGJ1aWx0IGFueXdheQotICogCi0gKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgdHJlZQorICogSW4gdGhlIGNhc2UgdGhlIGRvY3VtZW50IGlzIG5vdCBXZWxsIEZvcm1lZCwgYW4gYXR0ZW1wdCB0bworICogYnVpbGQgYSB0cmVlIGlzIHRyaWVkIGFueXdheQorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdGluZyBkb2N1bWVudCB0cmVlIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogICovCiAKIHhtbERvY1B0ciB4bWxSZWNvdmVyTWVtb3J5KGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKQEAgLTEyOTQ5LDEyICsxMzgzNSwxNSBAQAogLyoqCiAgKiB4bWxDbGVhbnVwUGFyc2VyOgogICoKLSAqIENsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBYTUwgbGlicmFyeS4gSXQgdHJpZXMgdG8gcmVjbGFpbSBhbGwKLSAqIHBhcnNpbmcgcmVsYXRlZCBnbG9iYWwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGxpYnJhcnkgcHJvY2Vzc2luZy4KLSAqIEl0IGRvZXNuJ3QgZGVhbGxvY2F0ZSBhbnkgZG9jdW1lbnQgcmVsYXRlZCBtZW1vcnkuIENhbGxpbmcgdGhpcwotICogZnVuY3Rpb24gc2hvdWxkIG5vdCBwcmV2ZW50IHJldXNpbmcgdGhlIGxpYnJhcnkgYnV0IG9uZSBzaG91bGQKLSAqIGNhbGwgeG1sQ2xlYW51cFBhcnNlcigpIG9ubHkgd2hlbiB0aGUgcHJvY2VzcyBoYXMKLSAqIGZpbmlzaGVkIHVzaW5nIHRoZSBsaWJyYXJ5IG9yIFhNTCBkb2N1bWVudCBidWlsdCB3aXRoIGl0LgorICogVGhpcyBmdW5jdGlvbiBuYW1lIGlzIHNvbWV3aGF0IG1pc2xlYWRpbmcuIEl0IGRvZXMgbm90IGNsZWFuIHVwCisgKiBwYXJzZXIgc3RhdGUsIGl0IGNsZWFucyB1cCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyAqIEl0IGlzIGEgY2xlYW51cCBmdW5jdGlvbiBmb3IgdGhlIFhNTCBsaWJyYXJ5LiBJdCB0cmllcyB0byByZWNsYWltIGFsbAorICogcmVsYXRlZCBnbG9iYWwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGxpYnJhcnkgcHJvY2Vzc2luZy4KKyAqIEl0IGRvZXNuJ3QgZGVhbGxvY2F0ZSBhbnkgZG9jdW1lbnQgcmVsYXRlZCBtZW1vcnkuIE9uZSBzaG91bGQKKyAqIGNhbGwgeG1sQ2xlYW51cFBhcnNlcigpIG9ubHkgd2hlbiB0aGUgcHJvY2VzcyBoYXMgZmluaXNoZWQgdXNpbmcKKyAqIHRoZSBsaWJyYXJ5IGFuZCBhbGwgWE1ML0hUTUwgZG9jdW1lbnRzIGJ1aWx0IHdpdGggaXQuCisgKiBTZWUgYWxzbyB4bWxJbml0UGFyc2VyKCkgd2hpY2ggaGFzIHRoZSBvcHBvc2l0ZSBmdW5jdGlvbiBvZiBwcmVwYXJpbmcKKyAqIHRoZSBsaWJyYXJ5IGZvciBvcGVyYXRpb25zLgogICovCiAKIHZvaWQKQEAgLTEzMDc3LDYgKzEzOTY2LDggQEAKICAgICBjdHh0LT5kZXB0aCA9IDA7CiAgICAgY3R4dC0+Y2hhcnNldCA9IFhNTF9DSEFSX0VOQ09ESU5HX1VURjg7CiAgICAgY3R4dC0+Y2F0YWxvZ3MgPSBOVUxMOworICAgIGN0eHQtPm5iZW50aXRpZXMgPSAwOworICAgIGN0eHQtPnNpemVlbnRpdGllcyA9IDA7CiAgICAgeG1sSW5pdE5vZGVJbmZvU2VxKCZjdHh0LT5ub2RlX3NlcSk7CiAKICAgICBpZiAoY3R4dC0+YXR0c0RlZmF1bHQgIT0gTlVMTCkgewpAQCAtMTMxODgsNiArMTQwNzksMTAgQEAKICAgICBpZiAoZW5jb2RpbmcgIT0gTlVMTCkgewogICAgICAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhkbHI7CiAKKyAgICAgICAgaWYgKGN0eHQtPmVuY29kaW5nICE9IE5VTEwpCisJICAgIHhtbEZyZWUoKHhtbENoYXIgKikgY3R4dC0+ZW5jb2RpbmcpOworICAgICAgICBjdHh0LT5lbmNvZGluZyA9IHhtbFN0cmR1cCgoY29uc3QgeG1sQ2hhciAqKSBlbmNvZGluZyk7CisKICAgICAgICAgaGRsciA9IHhtbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKGVuY29kaW5nKTsKICAgICAgICAgaWYgKGhkbHIgIT0gTlVMTCkgewogICAgICAgICAgICAgeG1sU3dpdGNoVG9FbmNvZGluZyhjdHh0LCBoZGxyKTsKQEAgLTEzMjAyLDUwICsxNDA5Nyw2MyBAQAogICAgIHJldHVybigwKTsKIH0KIAorCiAvKioKLSAqIHhtbEN0eHRVc2VPcHRpb25zOgorICogeG1sQ3R4dFVzZU9wdGlvbnNJbnRlcm5hbDoKICAqIEBjdHh0OiBhbiBYTUwgcGFyc2VyIGNvbnRleHQKICAqIEBvcHRpb25zOiAgYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24KKyAqIEBlbmNvZGluZzogIHRoZSB1c2VyIHByb3ZpZGVkIGVuY29kaW5nIHRvIHVzZQogICoKICAqIEFwcGxpZXMgdGhlIG9wdGlvbnMgdG8gdGhlIHBhcnNlciBjb250ZXh0CiAgKgogICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIHNldCBvZiB1bmtub3duIG9yIHVuaW1wbGVtZW50ZWQgb3B0aW9ucwogICogICAgICAgICBpbiBjYXNlIG9mIGVycm9yLgogICovCi1pbnQKLXhtbEN0eHRVc2VPcHRpb25zKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgaW50IG9wdGlvbnMpCitzdGF0aWMgaW50Cit4bWxDdHh0VXNlT3B0aW9uc0ludGVybmFsKHhtbFBhcnNlckN0eHRQdHIgY3R4dCwgaW50IG9wdGlvbnMsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQogewogICAgIGlmIChjdHh0ID09IE5VTEwpCiAgICAgICAgIHJldHVybigtMSk7CisgICAgaWYgKGVuY29kaW5nICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGN0eHQtPmVuY29kaW5nICE9IE5VTEwpCisJICAgIHhtbEZyZWUoKHhtbENoYXIgKikgY3R4dC0+ZW5jb2RpbmcpOworICAgICAgICBjdHh0LT5lbmNvZGluZyA9IHhtbFN0cmR1cCgoY29uc3QgeG1sQ2hhciAqKSBlbmNvZGluZyk7CisgICAgfQogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX1JFQ09WRVIpIHsKICAgICAgICAgY3R4dC0+cmVjb3ZlcnkgPSAxOwogICAgICAgICBvcHRpb25zIC09IFhNTF9QQVJTRV9SRUNPVkVSOworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX1JFQ09WRVI7CiAgICAgfSBlbHNlCiAgICAgICAgIGN0eHQtPnJlY292ZXJ5ID0gMDsKICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9EVERMT0FEKSB7CiAgICAgICAgIGN0eHQtPmxvYWRzdWJzZXQgPSBYTUxfREVURUNUX0lEUzsKICAgICAgICAgb3B0aW9ucyAtPSBYTUxfUEFSU0VfRFRETE9BRDsKKwljdHh0LT5vcHRpb25zIHw9IFhNTF9QQVJTRV9EVERMT0FEOwogICAgIH0gZWxzZQogICAgICAgICBjdHh0LT5sb2Fkc3Vic2V0ID0gMDsKICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9EVERBVFRSKSB7CiAgICAgICAgIGN0eHQtPmxvYWRzdWJzZXQgfD0gWE1MX0NPTVBMRVRFX0FUVFJTOwogICAgICAgICBvcHRpb25zIC09IFhNTF9QQVJTRV9EVERBVFRSOworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX0RUREFUVFI7CiAgICAgfQogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX05PRU5UKSB7CiAgICAgICAgIGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9IDE7CiAgICAgICAgIC8qIGN0eHQtPmxvYWRzdWJzZXQgfD0gWE1MX0RFVEVDVF9JRFM7ICovCiAgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX05PRU5UOworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX05PRU5UOwogICAgIH0gZWxzZQogICAgICAgICBjdHh0LT5yZXBsYWNlRW50aXRpZXMgPSAwOwogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX1BFREFOVElDKSB7CiAgICAgICAgIGN0eHQtPnBlZGFudGljID0gMTsKICAgICAgICAgb3B0aW9ucyAtPSBYTUxfUEFSU0VfUEVEQU5USUM7CisJY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfUEVEQU5USUM7CiAgICAgfSBlbHNlCiAgICAgICAgIGN0eHQtPnBlZGFudGljID0gMDsKICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9OT0JMQU5LUykgewogICAgICAgICBjdHh0LT5rZWVwQmxhbmtzID0gMDsKICAgICAgICAgY3R4dC0+c2F4LT5pZ25vcmFibGVXaGl0ZXNwYWNlID0geG1sU0FYMklnbm9yYWJsZVdoaXRlc3BhY2U7CiAgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX05PQkxBTktTOworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX05PQkxBTktTOwogICAgIH0gZWxzZQogICAgICAgICBjdHh0LT5rZWVwQmxhbmtzID0gMTsKICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9EVERWQUxJRCkgewpAQCAtMTMyNTUsNiArMTQxNjMsNyBAQAogICAgICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9OT0VSUk9SKQogICAgICAgICAgICAgY3R4dC0+dmN0eHQuZXJyb3IgPSBOVUxMOwogICAgICAgICBvcHRpb25zIC09IFhNTF9QQVJTRV9EVERWQUxJRDsKKwljdHh0LT5vcHRpb25zIHw9IFhNTF9QQVJTRV9EVERWQUxJRDsKICAgICB9IGVsc2UKICAgICAgICAgY3R4dC0+dmFsaWRhdGUgPSAwOwogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX05PV0FSTklORykgewpAQCAtMTMyNzQsMTcgKzE0MTgzLDIwIEBACiAgICAgICAgIGN0eHQtPnNheC0+ZW5kRWxlbWVudE5zID0gTlVMTDsKICAgICAgICAgY3R4dC0+c2F4LT5pbml0aWFsaXplZCA9IDE7CiAgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX1NBWDE7CisJY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfU0FYMTsKICAgICB9CiAjZW5kaWYgLyogTElCWE1MX1NBWDFfRU5BQkxFRCAqLwogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX05PRElDVCkgewogICAgICAgICBjdHh0LT5kaWN0TmFtZXMgPSAwOwogICAgICAgICBvcHRpb25zIC09IFhNTF9QQVJTRV9OT0RJQ1Q7CisJY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfTk9ESUNUOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGN0eHQtPmRpY3ROYW1lcyA9IDE7CiAgICAgfQogICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX05PQ0RBVEEpIHsKICAgICAgICAgY3R4dC0+c2F4LT5jZGF0YUJsb2NrID0gTlVMTDsKICAgICAgICAgb3B0aW9ucyAtPSBYTUxfUEFSU0VfTk9DREFUQTsKKwljdHh0LT5vcHRpb25zIHw9IFhNTF9QQVJTRV9OT0NEQVRBOwogICAgIH0KICAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9OU0NMRUFOKSB7CiAJY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfTlNDTEVBTjsKQEAgLTEzMjk4LDExICsxNDIxMCw0MyBAQAogCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX0NPTVBBQ1Q7CiAgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX0NPTVBBQ1Q7CiAgICAgfQorICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX09MRDEwKSB7CisJY3R4dC0+b3B0aW9ucyB8PSBYTUxfUEFSU0VfT0xEMTA7CisgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX09MRDEwOworICAgIH0KKyAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9OT0JBU0VGSVgpIHsKKwljdHh0LT5vcHRpb25zIHw9IFhNTF9QQVJTRV9OT0JBU0VGSVg7CisgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX05PQkFTRUZJWDsKKyAgICB9CisgICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFVHRSkgeworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX0hVR0U7CisgICAgICAgIG9wdGlvbnMgLT0gWE1MX1BBUlNFX0hVR0U7CisgICAgfQorICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX09MRFNBWCkgeworCWN0eHQtPm9wdGlvbnMgfD0gWE1MX1BBUlNFX09MRFNBWDsKKyAgICAgICAgb3B0aW9ucyAtPSBYTUxfUEFSU0VfT0xEU0FYOworICAgIH0KICAgICBjdHh0LT5saW5lbnVtYmVycyA9IDE7CiAgICAgcmV0dXJuIChvcHRpb25zKTsKIH0KIAogLyoqCisgKiB4bWxDdHh0VXNlT3B0aW9uczoKKyAqIEBjdHh0OiBhbiBYTUwgcGFyc2VyIGNvbnRleHQKKyAqIEBvcHRpb25zOiAgYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24KKyAqCisgKiBBcHBsaWVzIHRoZSBvcHRpb25zIHRvIHRoZSBwYXJzZXIgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBzZXQgb2YgdW5rbm93biBvciB1bmltcGxlbWVudGVkIG9wdGlvbnMKKyAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50Cit4bWxDdHh0VXNlT3B0aW9ucyh4bWxQYXJzZXJDdHh0UHRyIGN0eHQsIGludCBvcHRpb25zKQoreworICAgcmV0dXJuKHhtbEN0eHRVc2VPcHRpb25zSW50ZXJuYWwoY3R4dCwgb3B0aW9ucywgTlVMTCkpOworfQorCisvKioKICAqIHhtbERvUmVhZDoKICAqIEBjdHh0OiAgYW4gWE1MIHBhcnNlciBjb250ZXh0CiAgKiBAVVJMOiAgdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50CkBAIC0xMzMxMSw3ICsxNDI1NSw3IEBACiAgKiBAcmV1c2U6ICBrZWVwIHRoZSBjb250ZXh0IGZvciByZXVzZQogICoKICAqIENvbW1vbiBmcm9udC1lbmQgZm9yIHRoZSB4bWxSZWFkIGZ1bmN0aW9ucwotICogCisgKgogICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHRyZWUgb3IgTlVMTAogICovCiBzdGF0aWMgeG1sRG9jUHRyCkBAIC0xMzMxOSw4ICsxNDI2Myw4IEBACiAgICAgICAgICAgaW50IG9wdGlvbnMsIGludCByZXVzZSkKIHsKICAgICB4bWxEb2NQdHIgcmV0OwotICAgIAotICAgIHhtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOworCisgICAgeG1sQ3R4dFVzZU9wdGlvbnNJbnRlcm5hbChjdHh0LCBvcHRpb25zLCBlbmNvZGluZyk7CiAgICAgaWYgKGVuY29kaW5nICE9IE5VTEwpIHsKICAgICAgICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoZGxyOwogCmRpZmYgLS1naXQgYS9wYXJzZXJJbnRlcm5hbHMuYyBiL3BhcnNlckludGVybmFscy5jCmluZGV4IGQ3YWE0Y2YuLjc1OGM2YjMgMTAwNjQ0Ci0tLSBhL3BhcnNlckludGVybmFscy5jCisrKyBiL3BhcnNlckludGVybmFscy5jCkBAIC0xMzk5LDcgKzEzOTksOCBAQAogICAgIGlmIChpbnB1dCA9PSBOVUxMKSB7CiAJcmV0dXJuKE5VTEwpOwogICAgIH0KLSAgICBpbnB1dC0+ZmlsZW5hbWUgPSAoY2hhciAqKSBlbnRpdHktPlVSSTsKKyAgICBpZiAoZW50aXR5LT5VUkkgIT0gTlVMTCkKKwlpbnB1dC0+ZmlsZW5hbWUgPSAoY2hhciAqKSB4bWxTdHJkdXAoKHhtbENoYXIgKikgZW50aXR5LT5VUkkpOwogICAgIGlucHV0LT5iYXNlID0gZW50aXR5LT5jb250ZW50OwogICAgIGlucHV0LT5jdXIgPSBlbnRpdHktPmNvbnRlbnQ7CiAgICAgaW5wdXQtPmxlbmd0aCA9IGVudGl0eS0+bGVuZ3RoOwpAQCAtMTY2OSw2ICsxNjcwLDcgQEAKICAgICBjdHh0LT5kZXB0aCA9IDA7CiAgICAgY3R4dC0+Y2hhcnNldCA9IFhNTF9DSEFSX0VOQ09ESU5HX1VURjg7CiAgICAgY3R4dC0+Y2F0YWxvZ3MgPSBOVUxMOworICAgIGN0eHQtPm5iZW50aXRpZXMgPSAwOwogICAgIHhtbEluaXROb2RlSW5mb1NlcSgmY3R4dC0+bm9kZV9zZXEpOwogICAgIHJldHVybigwKTsKIH0KZGlmZiAtLWdpdCBhL3BhdHRlcm4uYyBiL3BhdHRlcm4uYwppbmRleCBlZTUxOTY4Li4wZTM4YzJkIDEwMDY0NAotLS0gYS9wYXR0ZXJuLmMKKysrIGIvcGF0dGVybi5jCkBAIC0yMjg1LDkgKzIyODUsMTMgQEAKIAlpZiAoc3RyZWFtLT5ibG9ja0xldmVsID09IHN0cmVhbS0+bGV2ZWwpCiAJICAgIHN0cmVhbS0+YmxvY2tMZXZlbCA9IC0xOwogCi0Jc3RyZWFtLT5sZXZlbC0tOwotCWlmIChzdHJlYW0tPmxldmVsIDwgMCkKLQkgICAgcmV0dXJuKC0xKTsJCQorCS8qCisJICogIHN0cmVhbS0+bGV2ZWwgY2FuIGJlIHplcm8gd2hlbiBYTUxfRklOQUxfSVNfQU5ZX05PREUgaXMgc2V0CisJICogIChzZWUgdGhlIHRocmVhZCBhdAorCSAqICBodHRwOi8vbWFpbC5nbm9tZS5vcmcvYXJjaGl2ZXMveHNsdC8yMDA4LUp1bHkvbXNnMDAwMjcuaHRtbCkKKwkgKi8KKwlpZiAoc3RyZWFtLT5sZXZlbCkKKwkgICAgc3RyZWFtLT5sZXZlbC0tOwogCS8qCiAJICogQ2hlY2sgZXZvbHV0aW9uIG9mIGV4aXN0aW5nIHN0YXRlcwogCSAqLwkKZGlmZiAtLWdpdCBhL3JlbGF4bmcuYyBiL3JlbGF4bmcuYwppbmRleCA2MGZkYmFiLi42NDU5NzY5IDEwMDY0NAotLS0gYS9yZWxheG5nLmMKKysrIGIvcmVsYXhuZy5jCkBAIC02NDk1LDYgKzY0OTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBjdHh0KTsKICAgICB9CiAKKyAgICAvKiBAQEBAICovCisKICAgICBjdHh0LT5ncmFtbWFyID0gb2xkOwogICAgIHJldHVybiAocmV0KTsKIH0KQEAgLTg4MTIsNiArODgxNCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgWE1MX1JFTEFYTkdfUkVGOgogICAgICAgICBjYXNlIFhNTF9SRUxBWE5HX1BBUkVOVFJFRjoKKwkgICAgaWYgKGRlZmluZS0+Y29udGVudCA9PSBOVUxMKSB7CisJICAgIH0KICAgICAgICAgICAgIHJldCA9IHhtbFJlbGF4TkdWYWxpZGF0ZVZhbHVlKGN0eHQsIGRlZmluZS0+Y29udGVudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NjaGVtYXRyb24uYyBiL3NjaGVtYXRyb24uYwppbmRleCAxNDZmZmM5Li4wM2ZhMzU3IDEwMDY0NAotLS0gYS9zY2hlbWF0cm9uLmMKKysrIGIvc2NoZW1hdHJvbi5jCkBAIC0xNjgsNiArMTY4LDEyIEBACiAgICAgeG1sT3V0cHV0V3JpdGVDYWxsYmFjayBpb3dyaXRlOyAvKiBpZiB1c2luZyBYTUxfU0NIRU1BVFJPTl9PVVRfSU8gKi8KICAgICB4bWxPdXRwdXRDbG9zZUNhbGxiYWNrICBpb2Nsb3NlOwogICAgIHZvaWQgKmlvY3R4OworCisgICAgLyogZXJyb3IgcmVwb3J0aW5nIGRhdGEgKi8KKyAgICB2b2lkICp1c2VyRGF0YTsgICAgICAgICAgICAgICAgICAgICAgLyogdXNlciBzcGVjaWZpYyBkYXRhIGJsb2NrICovCisgICAgeG1sU2NoZW1hdHJvblZhbGlkaXR5RXJyb3JGdW5jIGVycm9yOy8qIHRoZSBjYWxsYmFjayBpbiBjYXNlIG9mIGVycm9ycyAqLworICAgIHhtbFNjaGVtYXRyb25WYWxpZGl0eVdhcm5pbmdGdW5jIHdhcm5pbmc7LyogY2FsbGJhY2sgaW4gY2FzZSBvZiB3YXJuaW5nICovCisgICAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzZXJyb3I7ICAgICAgIC8qIHRoZSBzdHJ1Y3R1cmVkIGZ1bmN0aW9uICovCiB9OwogCiBzdHJ1Y3QgX3htbFNjaGVtYXRyb25QYXJzZXJDdHh0IHsKQEAgLTE5MywxMiArMTk5LDExIEBACiAgICAgaW50IG1heEluY2x1ZGVzOwkJLyogc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgICB4bWxOb2RlUHRyICppbmNsdWRlczsJLyogdGhlIGFycmF5IG9mIGluY2x1ZGVzICovCiAKLSAgICAvKiBlcnJvciBycmVwb3J0aW5nIGRhdGEgKi8KKyAgICAvKiBlcnJvciByZXBvcnRpbmcgZGF0YSAqLwogICAgIHZvaWQgKnVzZXJEYXRhOyAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VyIHNwZWNpZmljIGRhdGEgYmxvY2sgKi8KICAgICB4bWxTY2hlbWF0cm9uVmFsaWRpdHlFcnJvckZ1bmMgZXJyb3I7LyogdGhlIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3JzICovCiAgICAgeG1sU2NoZW1hdHJvblZhbGlkaXR5V2FybmluZ0Z1bmMgd2FybmluZzsvKiBjYWxsYmFjayBpbiBjYXNlIG9mIHdhcm5pbmcgKi8KICAgICB4bWxTdHJ1Y3R1cmVkRXJyb3JGdW5jIHNlcnJvcjsgICAgICAgLyogdGhlIHN0cnVjdHVyZWQgZnVuY3Rpb24gKi8KLQogfTsKIAogI2RlZmluZSBYTUxfU1RST05fQ1RYVF9QQVJTRVIgMQpAQCAtMTM2MSw3ICsxMzY2LDcgQEAKICAqLwogc3RhdGljIHZvaWQKIHhtbFNjaGVtYXRyb25SZXBvcnRTdWNjZXNzKHhtbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIgY3R4dCwgCi0JCSAgIHhtbFNjaGVtYXRyb25UZXN0UHRyIHRlc3QsIHhtbE5vZGVQdHIgY3VyLCBpbnQgc3VjY2VzcykgeworCQkgICB4bWxTY2hlbWF0cm9uVGVzdFB0ciB0ZXN0LCB4bWxOb2RlUHRyIGN1ciwgeG1sU2NoZW1hdHJvblBhdHRlcm5QdHIgcGF0dGVybiwgaW50IHN1Y2Nlc3MpIHsKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKGN1ciA9PSBOVUxMKSB8fCAodGVzdCA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuOwogICAgIC8qIGlmIHF1aWV0IGFuZCBub3QgU1ZSTCByZXBvcnQgb25seSBmYWlsdXJlcyAqLwpAQCAtMTM5MiwxOCArMTM5Nyw0MSBAQAogICAgICAgICAgICAgcmVwb3J0ID0geG1sU2NoZW1hdHJvbkZvcm1hdFJlcG9ydChjdHh0LCB0ZXN0LT5ub2RlLCBjdXIpOwogCWlmIChyZXBvcnQgPT0gTlVMTCkgewogCSAgICBpZiAodGVzdC0+dHlwZSA9PSBYTUxfU0NIRU1BVFJPTl9BU1NFUlQpIHsKLQkJc25wcmludGYobXNnLCA5OTksICIlcyBsaW5lICVsZDogbm9kZSBmYWlsZWQgYXNzZXJ0XG4iLAotCQkgICAgICAgICAoY29uc3QgY2hhciAqKSBwYXRoLCBsaW5lKTsKKyAgICAgICAgICAgIHJlcG9ydCA9IHhtbFN0cmR1cCgoY29uc3QgeG1sQ2hhciAqKSAibm9kZSBmYWlsZWQgYXNzZXJ0Iik7CiAJICAgIH0gZWxzZSB7Ci0JCXNucHJpbnRmKG1zZywgOTk5LCAiJXMgbGluZSAlbGQ6IG5vZGUgZmFpbGVkIHJlcG9ydFxuIiwKLQkJICAgICAgICAgKGNvbnN0IGNoYXIgKikgcGF0aCwgbGluZSk7CisgICAgICAgICAgICByZXBvcnQgPSB4bWxTdHJkdXAoKGNvbnN0IHhtbENoYXIgKikgIm5vZGUgZmFpbGVkIHJlcG9ydCIpOwogCSAgICB9Ci0JfSBlbHNlIHsKKwkgICAgfQogCSAgICBzbnByaW50Zihtc2csIDk5OSwgIiVzIGxpbmUgJWxkOiAlc1xuIiwgKGNvbnN0IGNoYXIgKikgcGF0aCwKIAkJICAgICBsaW5lLCAoY29uc3QgY2hhciAqKSByZXBvcnQpOwotCSAgICB4bWxGcmVlKChjaGFyICopIHJlcG9ydCk7CisKKyAgICBpZiAoY3R4dC0+ZmxhZ3MgJiBYTUxfU0NIRU1BVFJPTl9PVVRfRVJST1IpIHsKKyAgICAgICAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzY2hhbm5lbCA9IE5VTEw7CisgICAgICAgIHhtbEdlbmVyaWNFcnJvckZ1bmMgY2hhbm5lbCA9IE5VTEw7CisgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOworCisgICAgICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChjdHh0LT5zZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBzY2hhbm5lbCA9IGN0eHQtPnNlcnJvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gY3R4dC0+ZXJyb3I7CisgICAgICAgICAgICBkYXRhID0gY3R4dC0+dXNlckRhdGE7CiAJfQorCisgICAgICAgIF9feG1sUmFpc2VFcnJvcihzY2hhbm5lbCwgY2hhbm5lbCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGN1ciwgWE1MX0ZST01fU0NIRU1BVFJPTlYsCisgICAgICAgICAgICAgICAgICAgICAgICAodGVzdC0+dHlwZSA9PSBYTUxfU0NIRU1BVFJPTl9BU1NFUlQpP1hNTF9TQ0hFTUFUUk9OVl9BU1NFUlQ6WE1MX1NDSEVNQVRST05WX1JFUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FUlJfRVJST1IsIE5VTEwsIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAocGF0dGVybiA9PSBOVUxMKT9OVUxMOigoY29uc3QgY2hhciAqKSBwYXR0ZXJuLT5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSByZXBvcnQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cpOworICAgIH0gZWxzZSB7CiAJeG1sU2NoZW1hdHJvblJlcG9ydE91dHB1dChjdHh0LCBjdXIsICZtc2dbMF0pOworICAgIH0KKworICAgIHhtbEZyZWUoKGNoYXIgKikgcmVwb3J0KTsKKwogCWlmICgocGF0aCAhPSBOVUxMKSAmJiAocGF0aCAhPSAoeG1sQ2hhciAqKSBjdXItPm5hbWUpKQogCSAgICB4bWxGcmVlKHBhdGgpOwogICAgIH0KQEAgLTE0MjEsNyArMTQ0OSw3IEBACiAJCQkgICB4bWxTY2hlbWF0cm9uUGF0dGVyblB0ciBwYXR0ZXJuKSB7CiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChwYXR0ZXJuID09IE5VTEwpKQogICAgICAgICByZXR1cm47Ci0gICAgaWYgKGN0eHQtPmZsYWdzICYgWE1MX1NDSEVNQVRST05fT1VUX1FVSUVUKQorICAgIGlmICgoY3R4dC0+ZmxhZ3MgJiBYTUxfU0NIRU1BVFJPTl9PVVRfUVVJRVQpIHx8IChjdHh0LT5mbGFncyAmIFhNTF9TQ0hFTUFUUk9OX09VVF9FUlJPUikpIC8qIEVycm9yIGdpdmVzIHBhdHRlcm4gbmFtZSBhcyBwYXJ0IG9mIGVycm9yICovCiAgICAgICAgIHJldHVybjsKICAgICBpZiAoY3R4dC0+ZmxhZ3MgJiBYTUxfU0NIRU1BVFJPTl9PVVRfWE1MKSB7CiAgICAgICAgIFRPRE8KQEAgLTE0NDMsNiArMTQ3MSwyNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCisgKiB4bWxTY2hlbWF0cm9uU2V0VmFsaWRTdHJ1Y3R1cmVkRXJyb3JzOgorICogQGN0eHQ6ICBhIFNjaGVtYXRyb24gdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAc2Vycm9yOiAgdGhlIHN0cnVjdHVyZWQgZXJyb3IgZnVuY3Rpb24KKyAqIEBjdHg6IHRoZSBmdW5jdGlvbnMgY29udGV4dAorICoKKyAqIFNldCB0aGUgc3RydWN0dXJlZCBlcnJvciBjYWxsYmFjaworICovCit2b2lkCit4bWxTY2hlbWF0cm9uU2V0VmFsaWRTdHJ1Y3R1cmVkRXJyb3JzKHhtbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzZXJyb3IsIHZvaWQgKmN0eCkKK3sKKyAgICBpZiAoY3R4dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgY3R4dC0+c2Vycm9yID0gc2Vycm9yOworICAgIGN0eHQtPmVycm9yID0gTlVMTDsKKyAgICBjdHh0LT53YXJuaW5nID0gTlVMTDsKKyAgICBjdHh0LT51c2VyRGF0YSA9IGN0eDsKK30KKworLyoqCiAgKiB4bWxTY2hlbWF0cm9uTmV3VmFsaWRDdHh0OgogICogQHNjaGVtYTogIGEgcHJlY29tcGlsZWQgWE1MIFNjaGVtYXRyb25zCiAgKiBAb3B0aW9uczogYSBzZXQgb2YgeG1sU2NoZW1hdHJvblZhbGlkT3B0aW9ucwpAQCAtMTU1MCw3ICsxNTk4LDcgQEAKICAqLwogc3RhdGljIGludAogeG1sU2NoZW1hdHJvblJ1blRlc3QoeG1sU2NoZW1hdHJvblZhbGlkQ3R4dFB0ciBjdHh0LAotICAgICB4bWxTY2hlbWF0cm9uVGVzdFB0ciB0ZXN0LCB4bWxEb2NQdHIgaW5zdGFuY2UsIHhtbE5vZGVQdHIgY3VyKQorICAgICB4bWxTY2hlbWF0cm9uVGVzdFB0ciB0ZXN0LCB4bWxEb2NQdHIgaW5zdGFuY2UsIHhtbE5vZGVQdHIgY3VyLCB4bWxTY2hlbWF0cm9uUGF0dGVyblB0ciBwYXR0ZXJuKQogewogICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldDsKICAgICBpbnQgZmFpbGVkOwpAQCAtMTU5Nyw3ICsxNjQ1LDcgQEAKICAgICBlbHNlIGlmICgoIWZhaWxlZCkgJiYgKHRlc3QtPnR5cGUgPT0gWE1MX1NDSEVNQVRST05fUkVQT1JUKSkKICAgICAgICAgY3R4dC0+bmJlcnJvcnMrKzsKIAotICAgIHhtbFNjaGVtYXRyb25SZXBvcnRTdWNjZXNzKGN0eHQsIHRlc3QsIGN1ciwgIWZhaWxlZCk7CisgICAgeG1sU2NoZW1hdHJvblJlcG9ydFN1Y2Nlc3MoY3R4dCwgdGVzdCwgY3VyLCBwYXR0ZXJuLCAhZmFpbGVkKTsKIAogICAgIHJldHVybighZmFpbGVkKTsKIH0KQEAgLTE2NDMsNyArMTY5MSw3IEBACiAJCWlmICh4bWxQYXR0ZXJuTWF0Y2gocnVsZS0+cGF0dGVybiwgY3VyKSA9PSAxKSB7CiAJCSAgICB0ZXN0ID0gcnVsZS0+dGVzdHM7CiAJCSAgICB3aGlsZSAodGVzdCAhPSBOVUxMKSB7Ci0JCQl4bWxTY2hlbWF0cm9uUnVuVGVzdChjdHh0LCB0ZXN0LCBpbnN0YW5jZSwgY3VyKTsKKwkJCXhtbFNjaGVtYXRyb25SdW5UZXN0KGN0eHQsIHRlc3QsIGluc3RhbmNlLCBjdXIsICh4bWxTY2hlbWF0cm9uUGF0dGVyblB0cilydWxlLT5wYXR0ZXJuKTsKIAkJCXRlc3QgPSB0ZXN0LT5uZXh0OwogCQkgICAgfQogCQl9CkBAIC0xNjc0LDcgKzE3MjIsNyBAQAogCQkgICAgaWYgKHhtbFBhdHRlcm5NYXRjaChydWxlLT5wYXR0ZXJuLCBjdXIpID09IDEpIHsKIAkJCXRlc3QgPSBydWxlLT50ZXN0czsKIAkJCXdoaWxlICh0ZXN0ICE9IE5VTEwpIHsKLQkJCSAgICB4bWxTY2hlbWF0cm9uUnVuVGVzdChjdHh0LCB0ZXN0LCBpbnN0YW5jZSwgY3VyKTsKKwkJCSAgICB4bWxTY2hlbWF0cm9uUnVuVGVzdChjdHh0LCB0ZXN0LCBpbnN0YW5jZSwgY3VyLCBwYXR0ZXJuKTsKIAkJCSAgICB0ZXN0ID0gdGVzdC0+bmV4dDsKIAkJCX0KIAkJICAgIH0KZGlmZiAtLWdpdCBhL3RocmVhZHMuYyBiL3RocmVhZHMuYwppbmRleCBkNWExNzdkLi4yMjIzZThhIDEwMDY0NAotLS0gYS90aHJlYWRzLmMKKysrIGIvdGhyZWFkcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiB0aHJlYWRzLmM6IHNldCBvZiBnZW5lcmljIHRocmVhZGluZyByZWxhdGVkIHJvdXRpbmVzIAorICogdGhyZWFkcy5jOiBzZXQgb2YgZ2VuZXJpYyB0aHJlYWRpbmcgcmVsYXRlZCByb3V0aW5lcwogICoKICAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICAqCkBAIC02Myw2ICs2Myw4IEBACiBleHRlcm4gaW50IHB0aHJlYWRfa2V5X2NyZWF0ZSAocHRocmVhZF9rZXlfdCAqX19rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKQogCSAgIF9fYXR0cmlidXRlKCh3ZWFrKSk7CitleHRlcm4gaW50IHB0aHJlYWRfa2V5X2RlbGV0ZSAocHRocmVhZF9rZXlfdCBfX2tleSkKKwkgICBfX2F0dHJpYnV0ZSgod2VhaykpOwogZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2luaXQgKCkKIAkgICBfX2F0dHJpYnV0ZSgod2VhaykpOwogZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCkKQEAgLTczLDEyICs3NSwxOCBAQAogCSAgIF9fYXR0cmlidXRlKCh3ZWFrKSk7CiBleHRlcm4gaW50IHB0aHJlYWRfY29uZF9pbml0ICgpCiAJICAgX19hdHRyaWJ1dGUoKHdlYWspKTsKK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kgKCkKKwkgICBfX2F0dHJpYnV0ZSgod2VhaykpOworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfd2FpdCAoKQorCSAgIF9fYXR0cmlidXRlKCh3ZWFrKSk7CiBleHRlcm4gaW50IHB0aHJlYWRfZXF1YWwgKCkKIAkgICBfX2F0dHJpYnV0ZSgod2VhaykpOwogZXh0ZXJuIHB0aHJlYWRfdCBwdGhyZWFkX3NlbGYgKCkKIAkgICBfX2F0dHJpYnV0ZSgod2VhaykpOwogZXh0ZXJuIGludCBwdGhyZWFkX2tleV9jcmVhdGUgKCkKIAkgICBfX2F0dHJpYnV0ZSgod2VhaykpOworZXh0ZXJuIGludCBwdGhyZWFkX2tleV9kZWxldGUgKCkKKwkgICBfX2F0dHJpYnV0ZSgod2VhaykpOwogZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsICgpCiAJICAgX19hdHRyaWJ1dGUoKHdlYWspKTsKICNlbmRpZgpAQCAtMTAxLDggKzEwOSw4IEBACiAjZWxpZiBkZWZpbmVkIEhBVkVfV0lOMzJfVEhSRUFEUwogICAgIEhBTkRMRSBtdXRleDsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQlzZW1faWQgc2VtOwotCXRocmVhZF9pZCB0aWQ7CisgICAgc2VtX2lkIHNlbTsKKyAgICB0aHJlYWRfaWQgdGlkOwogI2Vsc2UKICAgICBpbnQgZW1wdHk7CiAjZW5kaWYKQEAgLTExNCwyMSArMTIyLDIyIEBACiBzdHJ1Y3QgX3htbFJNdXRleCB7CiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKICAgICBwdGhyZWFkX211dGV4X3QgbG9jazsKLSAgICB1bnNpZ25lZCBpbnQgICAgaGVsZDsKLSAgICB1bnNpZ25lZCBpbnQgICAgd2FpdGVyczsKLSAgICBwdGhyZWFkX3QgICAgICAgdGlkOwotICAgIHB0aHJlYWRfY29uZF90ICBjdjsKKyAgICB1bnNpZ25lZCBpbnQgaGVsZDsKKyAgICB1bnNpZ25lZCBpbnQgd2FpdGVyczsKKyAgICBwdGhyZWFkX3QgdGlkOworICAgIHB0aHJlYWRfY29uZF90IGN2OwogI2VsaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKICAgICBDUklUSUNBTF9TRUNUSU9OIGNzOwogICAgIHVuc2lnbmVkIGludCBjb3VudDsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQl4bWxNdXRleFB0ciBsb2NrOwotCXRocmVhZF9pZCB0aWQ7Ci0JaW50MzIgY291bnQ7CisgICAgeG1sTXV0ZXhQdHIgbG9jazsKKyAgICB0aHJlYWRfaWQgdGlkOworICAgIGludDMyIGNvdW50OwogI2Vsc2UKICAgICBpbnQgZW1wdHk7CiAjZW5kaWYKIH07CisKIC8qCiAgKiBUaGlzIG1vZHVsZSBzdGlsbCBoYXMgc29tZSBpbnRlcm5hbCBzdGF0aWMgZGF0YS4KICAqICAgLSB4bWxMaWJyYXJ5TG9jayBhIGdsb2JhbCBsb2NrCkBAIC0xMzYsOCArMTQ1LDggQEAKICAqLwogCiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKLXN0YXRpYyBwdGhyZWFkX2tleV90CWdsb2JhbGtleTsKLXN0YXRpYyBwdGhyZWFkX3QJbWFpbnRocmVhZDsKK3N0YXRpYyBwdGhyZWFkX2tleV90IGdsb2JhbGtleTsKK3N0YXRpYyBwdGhyZWFkX3QgbWFpbnRocmVhZDsKIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlX2NvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ2xvYmFsX2luaXRfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAjZWxpZiBkZWZpbmVkIEhBVkVfV0lOMzJfVEhSRUFEUwpAQCAtMTQ4LDEyICsxNTcsMTIgQEAKIHN0YXRpYyBEV09SRCBnbG9iYWxrZXkgPSBUTFNfT1VUX09GX0lOREVYRVM7CiAjZW5kaWYgLyogSEFWRV9DT01QSUxFUl9UTFMgKi8KIHN0YXRpYyBEV09SRCBtYWludGhyZWFkOwotc3RhdGljIHN0cnVjdAoteworc3RhdGljIHN0cnVjdCB7CiAgICAgRFdPUkQgZG9uZTsKICAgICBEV09SRCBjb250cm9sOwotfSBydW5fb25jZSA9IHsgMCwgMCB9OworfSBydW5fb25jZSA9IHsgMCwgMH07CiBzdGF0aWMgdm9sYXRpbGUgTFBDUklUSUNBTF9TRUNUSU9OIGdsb2JhbF9pbml0X2xvY2sgPSBOVUxMOworCiAvKiBlbmRpZiBIQVZFX1dJTjMyX1RIUkVBRFMgKi8KICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKIGludDMyIGdsb2JhbGtleSA9IDA7CkBAIC0xNjMsNyArMTcyLDggQEAKIHN0YXRpYyB2aW50MzIgZ2xvYmFsX2luaXRfY291bnQgPSAwOwogI2VuZGlmCiAKLXN0YXRpYyB4bWxSTXV0ZXhQdHIJeG1sTGlicmFyeUxvY2sgPSBOVUxMOworc3RhdGljIHhtbFJNdXRleFB0ciB4bWxMaWJyYXJ5TG9jayA9IE5VTEw7CisKICNpZmRlZiBMSUJYTUxfVEhSRUFEX0VOQUJMRUQKIHN0YXRpYyB2b2lkIHhtbE9uY2VJbml0KHZvaWQpOwogI2VuZGlmCkBAIC0xODUsMTUgKzE5NSwxNSBAQAogICAgICAgICByZXR1cm4gKE5VTEwpOwogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCAhPSAwKQotCXB0aHJlYWRfbXV0ZXhfaW5pdCgmdG9rLT5sb2NrLCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZ0b2stPmxvY2ssIE5VTEwpOwogI2VsaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKICAgICB0b2stPm11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpOwogI2VsaWYgZGVmaW5lZCBIQVZFX0JFT1NfVEhSRUFEUwotCWlmICgodG9rLT5zZW0gPSBjcmVhdGVfc2VtKDEsICJ4bWxNdXRleCIpKSA8IEJfT0spIHsKLQkJZnJlZSh0b2spOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdG9rLT50aWQgPSAtMTsKKyAgICBpZiAoKHRvay0+c2VtID0gY3JlYXRlX3NlbSgxLCAieG1sTXV0ZXgiKSkgPCBCX09LKSB7CisgICAgICAgIGZyZWUodG9rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRvay0+dGlkID0gLTE7CiAjZW5kaWYKICAgICByZXR1cm4gKHRvayk7CiB9CkBAIC0yMDgsMTUgKzIxOCwxNiBAQAogdm9pZAogeG1sRnJlZU11dGV4KHhtbE11dGV4UHRyIHRvaykKIHsKLSAgICBpZiAodG9rID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAodG9rID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCAhPSAwKQotCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdG9rLT5sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0b2stPmxvY2spOwogI2VsaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKICAgICBDbG9zZUhhbmRsZSh0b2stPm11dGV4KTsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQlkZWxldGVfc2VtKHRvay0+c2VtKTsKKyAgICBkZWxldGVfc2VtKHRvay0+c2VtKTsKICNlbmRpZgogICAgIGZyZWUodG9rKTsKIH0KQEAgLTIzNCwxNyArMjQ1LDE4IEBACiAgICAgICAgIHJldHVybjsKICNpZmRlZiBIQVZFX1BUSFJFQURfSAogICAgIGlmIChsaWJ4bWxfaXNfdGhyZWFkZWQgIT0gMCkKLQlwdGhyZWFkX211dGV4X2xvY2soJnRvay0+bG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdG9rLT5sb2NrKTsKICNlbGlmIGRlZmluZWQgSEFWRV9XSU4zMl9USFJFQURTCiAgICAgV2FpdEZvclNpbmdsZU9iamVjdCh0b2stPm11dGV4LCBJTkZJTklURSk7CiAjZWxpZiBkZWZpbmVkIEhBVkVfQkVPU19USFJFQURTCi0JaWYgKGFjcXVpcmVfc2VtKHRvay0+c2VtKSAhPSBCX05PX0VSUk9SKSB7CisgICAgaWYgKGFjcXVpcmVfc2VtKHRvay0+c2VtKSAhPSBCX05PX0VSUk9SKSB7CiAjaWZkZWYgREVCVUdfVEhSRUFEUwotCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgInhtbE11dGV4TG9jaygpOkJlT1M6Q291bGRuJ3QgYXF1aXJlIHNlbWFwaG9yZVxuIik7Ci0JCWV4aXQoKTsKKyAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAieG1sTXV0ZXhMb2NrKCk6QmVPUzpDb3VsZG4ndCBhcXVpcmUgc2VtYXBob3JlXG4iKTsKKyAgICAgICAgZXhpdCgpOwogI2VuZGlmCi0JfQotCXRvay0+dGlkID0gZmluZF90aHJlYWQoTlVMTCk7CisgICAgfQorICAgIHRvay0+dGlkID0gZmluZF90aHJlYWQoTlVMTCk7CiAjZW5kaWYKIAogfQpAQCAtMjYyLDE0ICsyNzQsMTQgQEAKICAgICAgICAgcmV0dXJuOwogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCAhPSAwKQotCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0b2stPmxvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdG9rLT5sb2NrKTsKICNlbGlmIGRlZmluZWQgSEFWRV9XSU4zMl9USFJFQURTCiAgICAgUmVsZWFzZU11dGV4KHRvay0+bXV0ZXgpOwogI2VsaWYgZGVmaW5lZCBIQVZFX0JFT1NfVEhSRUFEUwotCWlmICh0b2stPnRpZCA9PSBmaW5kX3RocmVhZChOVUxMKSkgewotCQl0b2stPnRpZCA9IC0xOwotCQlyZWxlYXNlX3NlbSh0b2stPnNlbSk7Ci0JfQorICAgIGlmICh0b2stPnRpZCA9PSBmaW5kX3RocmVhZChOVUxMKSkgeworICAgICAgICB0b2stPnRpZCA9IC0xOworICAgICAgICByZWxlYXNlX3NlbSh0b2stPnNlbSk7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTI5MiwyMCArMzA0LDIwIEBACiAgICAgICAgIHJldHVybiAoTlVMTCk7CiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKICAgICBpZiAobGlieG1sX2lzX3RocmVhZGVkICE9IDApIHsKLQlwdGhyZWFkX211dGV4X2luaXQoJnRvay0+bG9jaywgTlVMTCk7Ci0JdG9rLT5oZWxkID0gMDsKLQl0b2stPndhaXRlcnMgPSAwOwotCXB0aHJlYWRfY29uZF9pbml0KCZ0b2stPmN2LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZ0b2stPmxvY2ssIE5VTEwpOworICAgICAgICB0b2stPmhlbGQgPSAwOworICAgICAgICB0b2stPndhaXRlcnMgPSAwOworICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmdG9rLT5jdiwgTlVMTCk7CiAgICAgfQogI2VsaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZ0b2stPmNzKTsKICAgICB0b2stPmNvdW50ID0gMDsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQlpZiAoKHRvay0+bG9jayA9IHhtbE5ld011dGV4KCkpID09IE5VTEwpIHsKLQkJZnJlZSh0b2spOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdG9rLT5jb3VudCA9IDA7CisgICAgaWYgKCh0b2stPmxvY2sgPSB4bWxOZXdNdXRleCgpKSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUodG9rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRvay0+Y291bnQgPSAwOwogI2VuZGlmCiAgICAgcmV0dXJuICh0b2spOwogfQpAQCAtMzI0LDEzICszMzYsMTMgQEAKICAgICAgICAgcmV0dXJuOwogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCAhPSAwKSB7Ci0JcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0b2stPmxvY2spOwotCXB0aHJlYWRfY29uZF9kZXN0cm95KCZ0b2stPmN2KTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0b2stPmxvY2spOworICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmdG9rLT5jdik7CiAgICAgfQogI2VsaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJnRvay0+Y3MpOwogI2VsaWYgZGVmaW5lZCBIQVZFX0JFT1NfVEhSRUFEUwotCXhtbEZyZWVNdXRleCh0b2stPmxvY2spOworICAgIHhtbEZyZWVNdXRleCh0b2stPmxvY2spOwogI2VuZGlmCiAgICAgZnJlZSh0b2spOwogfQpAQCAtMzcwLDEzICszODIsMTMgQEAKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdG9rLT5jcyk7CiAgICAgKyt0b2stPmNvdW50OwogI2VsaWYgZGVmaW5lZCBIQVZFX0JFT1NfVEhSRUFEUwotCWlmICh0b2stPmxvY2stPnRpZCA9PSBmaW5kX3RocmVhZChOVUxMKSkgewotCQl0b2stPmNvdW50Kys7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQl4bWxNdXRleExvY2sodG9rLT5sb2NrKTsKLQkJdG9rLT5jb3VudCA9IDE7Ci0JfQorICAgIGlmICh0b2stPmxvY2stPnRpZCA9PSBmaW5kX3RocmVhZChOVUxMKSkgeworICAgICAgICB0b2stPmNvdW50Kys7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICB4bWxNdXRleExvY2sodG9rLT5sb2NrKTsKKyAgICAgICAgdG9rLT5jb3VudCA9IDE7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTM5NCw3ICs0MDYsNyBAQAogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCA9PSAwKQogICAgICAgICByZXR1cm47Ci0gICAgCisKICAgICBwdGhyZWFkX211dGV4X2xvY2soJnRvay0+bG9jayk7CiAgICAgdG9rLT5oZWxkLS07CiAgICAgaWYgKHRvay0+aGVsZCA9PSAwKSB7CkBAIC00MDQsMTYgKzQxNiwxNiBAQAogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdG9rLT5sb2NrKTsKICNlbGlmIGRlZmluZWQgSEFWRV9XSU4zMl9USFJFQURTCi0gICAgaWYgKCEtLXRvay0+Y291bnQpIAotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZ0b2stPmNzKTsKKyAgICBpZiAoIS0tdG9rLT5jb3VudCkKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnRvay0+Y3MpOwogI2VsaWYgZGVmaW5lZCBIQVZFX0JFT1NfVEhSRUFEUwotCWlmICh0b2stPmxvY2stPnRpZCA9PSBmaW5kX3RocmVhZChOVUxMKSkgewotCQl0b2stPmNvdW50LS07Ci0JCWlmICh0b2stPmNvdW50ID09IDApIHsKLQkJCXhtbE11dGV4VW5sb2NrKHRvay0+bG9jayk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KKyAgICBpZiAodG9rLT5sb2NrLT50aWQgPT0gZmluZF90aHJlYWQoTlVMTCkpIHsKKyAgICAgICAgdG9rLT5jb3VudC0tOworICAgICAgICBpZiAodG9rLT5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICB4bWxNdXRleFVubG9jayh0b2stPmxvY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtNDM1LDIzICs0NDcsMjkgQEAKIAogICAgIC8qIENyZWF0ZSBhIG5ldyBjcml0aWNhbCBzZWN0aW9uICovCiAgICAgaWYgKGdsb2JhbF9pbml0X2xvY2sgPT0gTlVMTCkgewotCWNzID0gbWFsbG9jKHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7Ci0JSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcyk7CisgICAgICAgIGNzID0gbWFsbG9jKHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CisgICAgICAgIGlmIChjcyA9PSBOVUxMKSB7CisgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sR2xvYmFsSW5pdE11dGV4TG9jazogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcyk7CiAKLQkvKiBTd2FwIGl0IGludG8gdGhlIGdsb2JhbF9pbml0X2xvY2sgKi8KKyAgICAgICAgLyogU3dhcCBpdCBpbnRvIHRoZSBnbG9iYWxfaW5pdF9sb2NrICovCiAjaWZkZWYgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyCi0JSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCZnbG9iYWxfaW5pdF9sb2NrLCBjcywgTlVMTCk7Ci0jZWxzZSAgLyogVXNlIG9sZGVyIHZvaWQqIHZlcnNpb24gKi8KLSAgICBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgodm9pZCAqKikmZ2xvYmFsX2luaXRfbG9jaywgKHZvaWQgKiljcywgTlVMTCk7CisgICAgICAgIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigmZ2xvYmFsX2luaXRfbG9jaywgY3MsIE5VTEwpOworI2Vsc2UgLyogVXNlIG9sZGVyIHZvaWQqIHZlcnNpb24gKi8KKyAgICAgICAgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKHZvaWQgKiopICZnbG9iYWxfaW5pdF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBjcywgTlVMTCk7CiAjZW5kaWYgLyogSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyICovCiAKLQkvKiBJZiBhbm90aGVyIHRocmVhZCBzdWNjZXNzZnVsbHkgcmVjb3JkZWQgaXRzIGNyaXRpY2FsCi0JICogc2VjdGlvbiBpbiB0aGUgZ2xvYmFsX2luaXRfbG9jayB0aGVuIGRpc2NhcmQgdGhlIG9uZQotCSAqIGFsbG9jYXRlZCBieSB0aGlzIHRocmVhZC4gKi8KLQlpZiAoZ2xvYmFsX2luaXRfbG9jayAhPSBjcykgewotCQlEZWxldGVDcml0aWNhbFNlY3Rpb24oY3MpOwotCSAgICBmcmVlKGNzKTsKLQl9CisgICAgICAgIC8qIElmIGFub3RoZXIgdGhyZWFkIHN1Y2Nlc3NmdWxseSByZWNvcmRlZCBpdHMgY3JpdGljYWwKKyAgICAgICAgICogc2VjdGlvbiBpbiB0aGUgZ2xvYmFsX2luaXRfbG9jayB0aGVuIGRpc2NhcmQgdGhlIG9uZQorICAgICAgICAgKiBhbGxvY2F0ZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgIGlmIChnbG9iYWxfaW5pdF9sb2NrICE9IGNzKSB7CisgICAgICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oY3MpOworICAgICAgICAgICAgZnJlZShjcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBMb2NrIHRoZSBjaG9zZW4gY3JpdGljYWwgc2VjdGlvbiAqLwpAQCAtNDYzLDI1ICs0ODEsMjYgQEAKICAgICBzZW0gPSBjcmVhdGVfc2VtKDEsICJ4bWxHbG9iYWxpbml0TXV0ZXgiKTsKIAogICAgIHdoaWxlIChnbG9iYWxfaW5pdF9sb2NrID09IC0xKSB7Ci0JaWYgKGF0b21pY19hZGQoJmdsb2JhbF9pbml0X2NvdW50LCAxKSA9PSAwKSB7Ci0JICAgIGdsb2JhbF9pbml0X2xvY2sgPSBzZW07Ci0JfSBlbHNlIHsKLQkgICAgc25vb3plKDEpOwotCSAgICBhdG9taWNfYWRkKCZnbG9iYWxfaW5pdF9jb3VudCwgLTEpOwotCX0KKyAgICAgICAgaWYgKGF0b21pY19hZGQoJmdsb2JhbF9pbml0X2NvdW50LCAxKSA9PSAwKSB7CisgICAgICAgICAgICBnbG9iYWxfaW5pdF9sb2NrID0gc2VtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25vb3plKDEpOworICAgICAgICAgICAgYXRvbWljX2FkZCgmZ2xvYmFsX2luaXRfY291bnQsIC0xKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIElmIGFub3RoZXIgdGhyZWFkIHN1Y2Nlc3NmdWxseSByZWNvcmRlZCBpdHMgY3JpdGljYWwKICAgICAgKiBzZWN0aW9uIGluIHRoZSBnbG9iYWxfaW5pdF9sb2NrIHRoZW4gZGlzY2FyZCB0aGUgb25lCiAgICAgICogYWxsb2NhdGVkIGJ5IHRoaXMgdGhyZWFkLiAqLwogICAgIGlmIChnbG9iYWxfaW5pdF9sb2NrICE9IHNlbSkKLQlkZWxldGVfc2VtKHNlbSk7CisgICAgICAgIGRlbGV0ZV9zZW0oc2VtKTsKIAogICAgIC8qIEFjcXVpcmUgdGhlIGNob3NlbiBzZW1hcGhvcmUgKi8KICAgICBpZiAoYWNxdWlyZV9zZW0oZ2xvYmFsX2luaXRfbG9jaykgIT0gQl9OT19FUlJPUikgewogI2lmZGVmIERFQlVHX1RIUkVBRFMKLQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgInhtbEdsb2JhbEluaXRNdXRleExvY2soKTpCZU9TOkNvdWxkbid0IGFjcXVpcmUgc2VtYXBob3JlXG4iKTsKLQlleGl0KCk7CisgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgInhtbEdsb2JhbEluaXRNdXRleExvY2soKTpCZU9TOkNvdWxkbid0IGFjcXVpcmUgc2VtYXBob3JlXG4iKTsKKyAgICAgICAgZXhpdCgpOwogI2VuZGlmCiAgICAgfQogI2VuZGlmCkBAIC00OTMsNyArNTEyLDkgQEAKICNpZmRlZiBIQVZFX1BUSFJFQURfSAogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnbG9iYWxfaW5pdF9sb2NrKTsKICNlbGlmIGRlZmluZWQgSEFWRV9XSU4zMl9USFJFQURTCi0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oZ2xvYmFsX2luaXRfbG9jayk7CisgICAgaWYgKGdsb2JhbF9pbml0X2xvY2sgIT0gTlVMTCkgeworCUxlYXZlQ3JpdGljYWxTZWN0aW9uKGdsb2JhbF9pbml0X2xvY2spOworICAgIH0KICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKICAgICByZWxlYXNlX3NlbShnbG9iYWxfaW5pdF9sb2NrKTsKICNlbmRpZgpAQCAtNTA1LDE0ICs1MjYsMTQgQEAKICAqIE1ha2VzIHN1cmUgdGhhdCB0aGUgZ2xvYmFsIGluaXRpYWxpemF0aW9uIG11dGV4IGlzIGRlc3Ryb3llZCBiZWZvcmUKICAqIGFwcGxpY2F0aW9uIHRlcm1pbmF0aW9uLgogICovCi12b2lkIF9feG1sR2xvYmFsSW5pdE11dGV4RGVzdHJveSh2b2lkKQordm9pZAorX194bWxHbG9iYWxJbml0TXV0ZXhEZXN0cm95KHZvaWQpCiB7CiAjaWYgZGVmaW5lZCBIQVZFX1dJTjMyX1RIUkVBRFMKLSAgICBpZiAoZ2xvYmFsX2luaXRfbG9jayAhPSBOVUxMKQotICAgIHsKLQlEZWxldGVDcml0aWNhbFNlY3Rpb24oZ2xvYmFsX2luaXRfbG9jayk7Ci0JZnJlZShnbG9iYWxfaW5pdF9sb2NrKTsKLQlnbG9iYWxfaW5pdF9sb2NrID0gTlVMTDsKKyAgICBpZiAoZ2xvYmFsX2luaXRfbG9jayAhPSBOVUxMKSB7CisgICAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihnbG9iYWxfaW5pdF9sb2NrKTsKKyAgICAgICAgZnJlZShnbG9iYWxfaW5pdF9sb2NrKTsKKyAgICAgICAgZ2xvYmFsX2luaXRfbG9jayA9IE5VTEw7CiAgICAgfQogI2VuZGlmCiB9CkBAIC01MjcsNiArNTQ4LDcgQEAKICNpZmRlZiB4bWxMYXN0RXJyb3IKICN1bmRlZiB4bWxMYXN0RXJyb3IKICNlbmRpZgorCiAvKioKICAqIHhtbEZyZWVHbG9iYWxTdGF0ZToKICAqIEBzdGF0ZTogIGEgdGhyZWFkIGdsb2JhbCBzdGF0ZQpAQCAtNTU3LDEwICs1NzksMTMgQEAKIHhtbE5ld0dsb2JhbFN0YXRlKHZvaWQpCiB7CiAgICAgeG1sR2xvYmFsU3RhdGUgKmdzOwotICAgIAorCiAgICAgZ3MgPSBtYWxsb2Moc2l6ZW9mKHhtbEdsb2JhbFN0YXRlKSk7Ci0gICAgaWYgKGdzID09IE5VTEwpCi0JcmV0dXJuKE5VTEwpOworICAgIGlmIChncyA9PSBOVUxMKSB7CisJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkieG1sR2V0R2xvYmFsU3RhdGU6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KIAogICAgIG1lbXNldChncywgMCwgc2l6ZW9mKHhtbEdsb2JhbFN0YXRlKSk7CiAgICAgeG1sSW5pdGlhbGl6ZUdsb2JhbFN0YXRlKGdzKTsKQEAgLTU3MiwxNSArNTk3LDE2IEBACiAjaWZkZWYgSEFWRV9XSU4zMl9USFJFQURTCiAjaWYgIWRlZmluZWQoSEFWRV9DT01QSUxFUl9UTFMpCiAjaWYgZGVmaW5lZChMSUJYTUxfU1RBVElDKSAmJiAhZGVmaW5lZChMSUJYTUxfU1RBVElDX0ZPUl9ETEwpCi10eXBlZGVmIHN0cnVjdCBfeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zCi17Cit0eXBlZGVmIHN0cnVjdCBfeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zIHsKICAgICBIQU5ETEUgdGhyZWFkOwogICAgIHZvaWQgKm1lbW9yeTsKIH0geG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zOwogCi1zdGF0aWMgdm9pZCBYTUxDREVDTCB4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXIgKHZvaWQgKnApCitzdGF0aWMgdm9pZCBYTUxDREVDTAoreG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyKHZvaWQgKnApCiB7Ci0gICAgeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICpwYXJhbXMgPSAoeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICopIHA7CisgICAgeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICpwYXJhbXMgPQorICAgICAgICAoeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICopIHA7CiAgICAgV2FpdEZvclNpbmdsZU9iamVjdChwYXJhbXMtPnRocmVhZCwgSU5GSU5JVEUpOwogICAgIENsb3NlSGFuZGxlKHBhcmFtcy0+dGhyZWFkKTsKICAgICB4bWxGcmVlR2xvYmFsU3RhdGUocGFyYW1zLT5tZW1vcnkpOwpAQCAtNTg5LDE0ICs2MTUsMTMgQEAKIH0KICNlbHNlIC8qIExJQlhNTF9TVEFUSUMgJiYgIUxJQlhNTF9TVEFUSUNfRk9SX0RMTCAqLwogCi10eXBlZGVmIHN0cnVjdCBfeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zCi17Cit0eXBlZGVmIHN0cnVjdCBfeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zIHsKICAgICB2b2lkICptZW1vcnk7Ci0gICAgc3RydWN0IF94bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMgKiBwcmV2OwotICAgIHN0cnVjdCBfeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICogbmV4dDsKKyAgICBzdHJ1Y3QgX3htbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqcHJldjsKKyAgICBzdHJ1Y3QgX3htbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqbmV4dDsKIH0geG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zOwogCi1zdGF0aWMgeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICogY2xlYW51cF9oZWxwZXJzX2hlYWQgPSBOVUxMOworc3RhdGljIHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqY2xlYW51cF9oZWxwZXJzX2hlYWQgPSBOVUxMOwogc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gY2xlYW51cF9oZWxwZXJzX2NzOwogCiAjZW5kaWYgLyogTElCWE1MU1RBVElDICYmICFMSUJYTUxfU1RBVElDX0ZPUl9ETEwgKi8KQEAgLTYwNCwxNyArNjI5LDIwIEBACiAjZW5kaWYgLyogSEFWRV9XSU4zMl9USFJFQURTICovCiAKICNpZiBkZWZpbmVkIEhBVkVfQkVPU19USFJFQURTCisKIC8qKgogICogeG1sR2xvYmFsU3RhdGVDbGVhbnVwOgogICogQGRhdGE6IHVudXNlZCBwYXJhbWV0ZXIKICAqCiAgKiBVc2VkIGZvciBCZW9zIG9ubHkKICAqLwotdm9pZCB4bWxHbG9iYWxTdGF0ZUNsZWFudXAodm9pZCAqZGF0YSkKK3ZvaWQKK3htbEdsb2JhbFN0YXRlQ2xlYW51cCh2b2lkICpkYXRhKQogewotCXZvaWQgKmdsb2JhbHZhbCA9IHRsc19nZXQoZ2xvYmFsa2V5KTsKLQlpZiAoZ2xvYmFsdmFsICE9IE5VTEwpCi0JCXhtbEZyZWVHbG9iYWxTdGF0ZShnbG9iYWx2YWwpOworICAgIHZvaWQgKmdsb2JhbHZhbCA9IHRsc19nZXQoZ2xvYmFsa2V5KTsKKworICAgIGlmIChnbG9iYWx2YWwgIT0gTlVMTCkKKyAgICAgICAgeG1sRnJlZUdsb2JhbFN0YXRlKGdsb2JhbHZhbCk7CiB9CiAjZW5kaWYKIApAQCAtNjMyLDEzICs2NjAsMTUgQEAKICAgICB4bWxHbG9iYWxTdGF0ZSAqZ2xvYmFsdmFsOwogCiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCA9PSAwKQotICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgICAgIHJldHVybiAoTlVMTCk7CiAKICAgICBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgeG1sT25jZUluaXQpOwogCiAgICAgaWYgKChnbG9iYWx2YWwgPSAoeG1sR2xvYmFsU3RhdGUgKikKLQkJcHRocmVhZF9nZXRzcGVjaWZpYyhnbG9iYWxrZXkpKSA9PSBOVUxMKSB7CisgICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKGdsb2JhbGtleSkpID09IE5VTEwpIHsKICAgICAgICAgeG1sR2xvYmFsU3RhdGUgKnRzZCA9IHhtbE5ld0dsb2JhbFN0YXRlKCk7CisJaWYgKHRzZCA9PSBOVUxMKQorCSAgICByZXR1cm4oTlVMTCk7CiAKICAgICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnbG9iYWxrZXksIHRzZCk7CiAgICAgICAgIHJldHVybiAodHNkKTsKQEAgLTY0Nyw0MyArNjc3LDU0IEBACiAjZWxpZiBkZWZpbmVkIEhBVkVfV0lOMzJfVEhSRUFEUwogI2lmIGRlZmluZWQoSEFWRV9DT01QSUxFUl9UTFMpCiAgICAgaWYgKCF0bHN0YXRlX2luaXRlZCkgewotCXRsc3RhdGVfaW5pdGVkID0gMTsKLQl4bWxJbml0aWFsaXplR2xvYmFsU3RhdGUoJnRsc3RhdGUpOworICAgICAgICB0bHN0YXRlX2luaXRlZCA9IDE7CisgICAgICAgIHhtbEluaXRpYWxpemVHbG9iYWxTdGF0ZSgmdGxzdGF0ZSk7CiAgICAgfQogICAgIHJldHVybiAmdGxzdGF0ZTsKICNlbHNlIC8qIEhBVkVfQ09NUElMRVJfVExTICovCiAgICAgeG1sR2xvYmFsU3RhdGUgKmdsb2JhbHZhbDsKLSAgICB4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMgKiBwOworICAgIHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqcDsKIAogICAgIHhtbE9uY2VJbml0KCk7CiAjaWYgZGVmaW5lZChMSUJYTUxfU1RBVElDKSAmJiAhZGVmaW5lZChMSUJYTUxfU1RBVElDX0ZPUl9ETEwpCi0gICAgZ2xvYmFsdmFsID0gKHhtbEdsb2JhbFN0YXRlICopVGxzR2V0VmFsdWUoZ2xvYmFsa2V5KTsKKyAgICBnbG9iYWx2YWwgPSAoeG1sR2xvYmFsU3RhdGUgKikgVGxzR2V0VmFsdWUoZ2xvYmFsa2V5KTsKICNlbHNlCi0gICAgcCA9ICh4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMqKVRsc0dldFZhbHVlKGdsb2JhbGtleSk7Ci0gICAgZ2xvYmFsdmFsID0gKHhtbEdsb2JhbFN0YXRlICopKHAgPyBwLT5tZW1vcnkgOiBOVUxMKTsKKyAgICBwID0gKHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqKSBUbHNHZXRWYWx1ZShnbG9iYWxrZXkpOworICAgIGdsb2JhbHZhbCA9ICh4bWxHbG9iYWxTdGF0ZSAqKSAocCA/IHAtPm1lbW9yeSA6IE5VTEwpOwogI2VuZGlmCiAgICAgaWYgKGdsb2JhbHZhbCA9PSBOVUxMKSB7Ci0JeG1sR2xvYmFsU3RhdGUgKnRzZCA9IHhtbE5ld0dsb2JhbFN0YXRlKCk7Ci0JcCA9ICh4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMgKikgbWFsbG9jKHNpemVvZih4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMpKTsKLQlwLT5tZW1vcnkgPSB0c2Q7CisgICAgICAgIHhtbEdsb2JhbFN0YXRlICp0c2QgPSB4bWxOZXdHbG9iYWxTdGF0ZSgpOworCisgICAgICAgIGlmICh0c2QgPT0gTlVMTCkKKwkgICAgcmV0dXJuKE5VTEwpOworICAgICAgICBwID0gKHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqKQorICAgICAgICAgICAgbWFsbG9jKHNpemVvZih4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMpKTsKKwlpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sR2V0R2xvYmFsU3RhdGU6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgeG1sRnJlZUdsb2JhbFN0YXRlKHRzZCk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisgICAgICAgIHAtPm1lbW9yeSA9IHRzZDsKICNpZiBkZWZpbmVkKExJQlhNTF9TVEFUSUMpICYmICFkZWZpbmVkKExJQlhNTF9TVEFUSUNfRk9SX0RMTCkKLQlEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgR2V0Q3VycmVudFRocmVhZCgpLCAKLQkJR2V0Q3VycmVudFByb2Nlc3MoKSwgJnAtPnRocmVhZCwgMCwgVFJVRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKLQlUbHNTZXRWYWx1ZShnbG9iYWxrZXksIHRzZCk7Ci0JX2JlZ2ludGhyZWFkKHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlciwgMCwgcCk7CisgICAgICAgIER1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLCBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLCAmcC0+dGhyZWFkLCAwLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgICAgICAgVGxzU2V0VmFsdWUoZ2xvYmFsa2V5LCB0c2QpOworICAgICAgICBfYmVnaW50aHJlYWQoeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyLCAwLCBwKTsKICNlbHNlCi0JRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7CQorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY2xlYW51cF9oZWxwZXJzX2NzKTsKICAgICAgICAgaWYgKGNsZWFudXBfaGVscGVyc19oZWFkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGNsZWFudXBfaGVscGVyc19oZWFkLT5wcmV2ID0gcDsKICAgICAgICAgfQotCXAtPm5leHQgPSBjbGVhbnVwX2hlbHBlcnNfaGVhZDsKLQlwLT5wcmV2ID0gTlVMTDsKLQljbGVhbnVwX2hlbHBlcnNfaGVhZCA9IHA7Ci0JVGxzU2V0VmFsdWUoZ2xvYmFsa2V5LCBwKTsKLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY2xlYW51cF9oZWxwZXJzX2NzKTsJCisgICAgICAgIHAtPm5leHQgPSBjbGVhbnVwX2hlbHBlcnNfaGVhZDsKKyAgICAgICAgcC0+cHJldiA9IE5VTEw7CisgICAgICAgIGNsZWFudXBfaGVscGVyc19oZWFkID0gcDsKKyAgICAgICAgVGxzU2V0VmFsdWUoZ2xvYmFsa2V5LCBwKTsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7CiAjZW5kaWYKIAotCXJldHVybiAodHNkKTsKKyAgICAgICAgcmV0dXJuICh0c2QpOwogICAgIH0KICAgICByZXR1cm4gKGdsb2JhbHZhbCk7CiAjZW5kaWYgLyogSEFWRV9DT01QSUxFUl9UTFMgKi8KQEAgLTY5Miw5ICs3MzMsMTAgQEAKIAogICAgIHhtbE9uY2VJbml0KCk7CiAKLSAgICBpZiAoKGdsb2JhbHZhbCA9ICh4bWxHbG9iYWxTdGF0ZSAqKQotCQl0bHNfZ2V0KGdsb2JhbGtleSkpID09IE5VTEwpIHsKKyAgICBpZiAoKGdsb2JhbHZhbCA9ICh4bWxHbG9iYWxTdGF0ZSAqKSB0bHNfZ2V0KGdsb2JhbGtleSkpID09IE5VTEwpIHsKICAgICAgICAgeG1sR2xvYmFsU3RhdGUgKnRzZCA9IHhtbE5ld0dsb2JhbFN0YXRlKCk7CisJaWYgKHRzZCA9PSBOVUxMKQorCSAgICByZXR1cm4gKE5VTEwpOwogCiAgICAgICAgIHRsc19zZXQoZ2xvYmFsa2V5LCB0c2QpOwogICAgICAgICBvbl9leGl0X3RocmVhZCh4bWxHbG9iYWxTdGF0ZUNsZWFudXAsIE5VTEwpOwpAQCAtNzAyLDcgKzc0NCw3IEBACiAgICAgfQogICAgIHJldHVybiAoZ2xvYmFsdmFsKTsKICNlbHNlCi0gICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybiAoTlVMTCk7CiAjZW5kaWYKIH0KIApAQCAtNzI0LDE0ICs3NjYsMTQgQEAKIHsKICNpZmRlZiBIQVZFX1BUSFJFQURfSAogICAgIGlmIChsaWJ4bWxfaXNfdGhyZWFkZWQgPT0gMCkKLSAgICAgICAgcmV0dXJuKDApOwotICAgIHJldHVybigoaW50KSBwdGhyZWFkX3NlbGYoKSk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgcmV0dXJuICgoaW50KSBwdGhyZWFkX3NlbGYoKSk7CiAjZWxpZiBkZWZpbmVkIEhBVkVfV0lOMzJfVEhSRUFEUwogICAgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQlyZXR1cm4gZmluZF90aHJlYWQoTlVMTCk7CisgICAgcmV0dXJuIGZpbmRfdGhyZWFkKE5VTEwpOwogI2Vsc2UKLSAgICByZXR1cm4oKGludCkgMCk7CisgICAgcmV0dXJuICgoaW50KSAwKTsKICNlbmRpZgogfQogCkBAIC03NDksMjUgKzc5MSwyNSBAQAogICAgIGlmIChsaWJ4bWxfaXNfdGhyZWFkZWQgPT0gLTEpCiAgICAgICAgIHhtbEluaXRUaHJlYWRzKCk7CiAgICAgaWYgKGxpYnhtbF9pc190aHJlYWRlZCA9PSAwKQotICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIHJldHVybiAoMSk7CiAgICAgcHRocmVhZF9vbmNlKCZvbmNlX2NvbnRyb2wsIHhtbE9uY2VJbml0KTsKICNlbGlmIGRlZmluZWQgSEFWRV9XSU4zMl9USFJFQURTCi0gICAgeG1sT25jZUluaXQgKCk7IAorICAgIHhtbE9uY2VJbml0KCk7CiAjZWxpZiBkZWZpbmVkIEhBVkVfQkVPU19USFJFQURTCiAgICAgeG1sT25jZUluaXQoKTsKICNlbmRpZgotICAgICAgICAKKwogI2lmZGVmIERFQlVHX1RIUkVBRFMKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgInhtbElzTWFpblRocmVhZCgpXG4iKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICi0gICAgcmV0dXJuKG1haW50aHJlYWQgPT0gcHRocmVhZF9zZWxmKCkpOworICAgIHJldHVybiAobWFpbnRocmVhZCA9PSBwdGhyZWFkX3NlbGYoKSk7CiAjZWxpZiBkZWZpbmVkIEhBVkVfV0lOMzJfVEhSRUFEUwotICAgIHJldHVybihtYWludGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWRJZCAoKSk7CisgICAgcmV0dXJuIChtYWludGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKICNlbGlmIGRlZmluZWQgSEFWRV9CRU9TX1RIUkVBRFMKLQlyZXR1cm4obWFpbnRocmVhZCA9PSBmaW5kX3RocmVhZChOVUxMKSk7CisgICAgcmV0dXJuIChtYWludGhyZWFkID09IGZpbmRfdGhyZWFkKE5VTEwpKTsKICNlbHNlCi0gICAgcmV0dXJuKDEpOworICAgIHJldHVybiAoMSk7CiAjZW5kaWYKIH0KIApAQCAtODE5LDI0ICs4NjEsMjggQEAKICNpZmRlZiBIQVZFX1BUSFJFQURfSAogICAgIGlmIChsaWJ4bWxfaXNfdGhyZWFkZWQgPT0gLTEpIHsKICAgICAgICAgaWYgKChwdGhyZWFkX29uY2UgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfZ2V0c3BlY2lmaWMgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfc2V0c3BlY2lmaWMgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfa2V5X2NyZWF0ZSAhPSBOVUxMKSAmJgotCSAgICAocHRocmVhZF9tdXRleF9pbml0ICE9IE5VTEwpICYmCi0JICAgIChwdGhyZWFkX211dGV4X2Rlc3Ryb3kgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfbXV0ZXhfbG9jayAhPSBOVUxMKSAmJgotCSAgICAocHRocmVhZF9tdXRleF91bmxvY2sgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfY29uZF9pbml0ICE9IE5VTEwpICYmCi0JICAgIChwdGhyZWFkX2VxdWFsICE9IE5VTEwpICYmCi0JICAgIChwdGhyZWFkX3NlbGYgIT0gTlVMTCkgJiYKLQkgICAgKHB0aHJlYWRfa2V5X2NyZWF0ZSAhPSBOVUxMKSAmJgotCSAgICAocHRocmVhZF9jb25kX3NpZ25hbCAhPSBOVUxMKSkgewotCSAgICBsaWJ4bWxfaXNfdGhyZWFkZWQgPSAxOworICAgICAgICAgICAgKHB0aHJlYWRfZ2V0c3BlY2lmaWMgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIChwdGhyZWFkX3NldHNwZWNpZmljICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9rZXlfY3JlYXRlICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9rZXlfZGVsZXRlICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9tdXRleF9pbml0ICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9tdXRleF9kZXN0cm95ICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9tdXRleF9sb2NrICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9tdXRleF91bmxvY2sgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIChwdGhyZWFkX2NvbmRfaW5pdCAhPSBOVUxMKSAmJgorICAgICAgICAgICAgKHB0aHJlYWRfY29uZF9kZXN0cm95ICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9jb25kX3dhaXQgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIChwdGhyZWFkX2VxdWFsICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9zZWxmICE9IE5VTEwpICYmCisgICAgICAgICAgICAocHRocmVhZF9jb25kX3NpZ25hbCAhPSBOVUxMKSkgeworICAgICAgICAgICAgbGlieG1sX2lzX3RocmVhZGVkID0gMTsKKwogLyogZnByaW50ZihzdGRlcnIsICJSdW5uaW5nIG11bHRpdGhyZWFkZWRcbiIpOyAqLwotCX0gZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CisKIC8qIGZwcmludGYoc3RkZXJyLCAiUnVubmluZyB3aXRob3V0IG11bHRpdGhyZWFkXG4iKTsgKi8KLQkgICAgbGlieG1sX2lzX3RocmVhZGVkID0gMDsKLQl9CisgICAgICAgICAgICBsaWJ4bWxfaXNfdGhyZWFkZWQgPSAwOworICAgICAgICB9CiAgICAgfQogI2VuZGlmCiB9CkBAIC04NTUsMjUgKzkwMSwzMSBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpICYmICFkZWZpbmVkKEhBVkVfQ09NUElMRVJfVExTKSAmJiAoIWRlZmluZWQoTElCWE1MX1NUQVRJQykgfHwgZGVmaW5lZChMSUJYTUxfU1RBVElDX0ZPUl9ETEwpKQogICAgIGlmIChnbG9iYWxrZXkgIT0gVExTX09VVF9PRl9JTkRFWEVTKSB7Ci0JeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICogcDsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbigmY2xlYW51cF9oZWxwZXJzX2NzKTsKLQlwID0gY2xlYW51cF9oZWxwZXJzX2hlYWQ7Ci0Jd2hpbGUgKHAgIT0gTlVMTCkgewotCQl4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMgKiB0ZW1wID0gcDsKLQkJcCA9IHAtPm5leHQ7Ci0JCXhtbEZyZWVHbG9iYWxTdGF0ZSh0ZW1wLT5tZW1vcnkpOwotCQlmcmVlKHRlbXApOwotCX0KLQljbGVhbnVwX2hlbHBlcnNfaGVhZCA9IDA7Ci0JTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7Ci0JVGxzRnJlZShnbG9iYWxrZXkpOwotCWdsb2JhbGtleSA9IFRMU19PVVRfT0ZfSU5ERVhFUzsKKyAgICAgICAgeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICpwOworCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjbGVhbnVwX2hlbHBlcnNfY3MpOworICAgICAgICBwID0gY2xlYW51cF9oZWxwZXJzX2hlYWQ7CisgICAgICAgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqdGVtcCA9IHA7CisKKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICAgICAgeG1sRnJlZUdsb2JhbFN0YXRlKHRlbXAtPm1lbW9yeSk7CisgICAgICAgICAgICBmcmVlKHRlbXApOworICAgICAgICB9CisgICAgICAgIGNsZWFudXBfaGVscGVyc19oZWFkID0gMDsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7CisgICAgICAgIFRsc0ZyZWUoZ2xvYmFsa2V5KTsKKyAgICAgICAgZ2xvYmFsa2V5ID0gVExTX09VVF9PRl9JTkRFWEVTOwogICAgIH0KICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7CisjZWxpZiBkZWZpbmVkIEhBVkVfUFRIUkVBRF9ICisgICAgaWYgKChsaWJ4bWxfaXNfdGhyZWFkZWQpICAmJiAocHRocmVhZF9rZXlfZGVsZXRlICE9IE5VTEwpKQorICAgICAgICBwdGhyZWFkX2tleV9kZWxldGUoZ2xvYmFsa2V5KTsKICNlbmRpZgogfQogCiAjaWZkZWYgTElCWE1MX1RIUkVBRF9FTkFCTEVECisKIC8qKgogICogeG1sT25jZUluaXQKICAqCkBAIC04ODQsNyArOTM2LDggQEAKICAqIGRldGFpbHMuCiAgKi8KIHN0YXRpYyB2b2lkCi14bWxPbmNlSW5pdCh2b2lkKSB7Cit4bWxPbmNlSW5pdCh2b2lkKQorewogI2lmZGVmIEhBVkVfUFRIUkVBRF9ICiAgICAgKHZvaWQpIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ2xvYmFsa2V5LCB4bWxGcmVlR2xvYmFsU3RhdGUpOwogICAgIG1haW50aHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKQEAgLTg5MiwxNSArOTQ1LDEzIEBACiAKICNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfVEhSRUFEUykKICAgICBpZiAoIXJ1bl9vbmNlLmRvbmUpIHsKLSAgICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50KCZydW5fb25jZS5jb250cm9sKSA9PSAxKQotICAgICAgICB7CisgICAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCgmcnVuX29uY2UuY29udHJvbCkgPT0gMSkgewogI2lmICFkZWZpbmVkKEhBVkVfQ09NUElMRVJfVExTKQogICAgICAgICAgICAgZ2xvYmFsa2V5ID0gVGxzQWxsb2MoKTsKICNlbmRpZgogICAgICAgICAgICAgbWFpbnRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgICAgICAgcnVuX29uY2UuZG9uZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBBbm90aGVyIHRocmVhZCBpcyB3b3JraW5nOyBnaXZlIHVwIG91ciBzbGljZSBhbmQKICAgICAgICAgICAgICAqIHdhaXQgdW50aWwgdGhleSdyZSBkb25lLiAqLwogICAgICAgICAgICAgd2hpbGUgKCFydW5fb25jZS5kb25lKQpAQCAtOTEwLDEyICs5NjEsMTIgQEAKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9CRU9TX1RIUkVBRFMKLQlpZiAoYXRvbWljX2FkZCgmcnVuX29uY2VfaW5pdCwgMSkgPT0gMCkgewotCQlnbG9iYWxrZXkgPSB0bHNfYWxsb2NhdGUoKTsKLQkJdGxzX3NldChnbG9iYWxrZXksIE5VTEwpOwotCQltYWludGhyZWFkID0gZmluZF90aHJlYWQoTlVMTCk7Ci0JfSBlbHNlCi0JCWF0b21pY19hZGQoJnJ1bl9vbmNlX2luaXQsIC0xKTsKKyAgICBpZiAoYXRvbWljX2FkZCgmcnVuX29uY2VfaW5pdCwgMSkgPT0gMCkgeworICAgICAgICBnbG9iYWxrZXkgPSB0bHNfYWxsb2NhdGUoKTsKKyAgICAgICAgdGxzX3NldChnbG9iYWxrZXksIE5VTEwpOworICAgICAgICBtYWludGhyZWFkID0gZmluZF90aHJlYWQoTlVMTCk7CisgICAgfSBlbHNlCisgICAgICAgIGF0b21pY19hZGQoJnJ1bl9vbmNlX2luaXQsIC0xKTsKICNlbmRpZgogfQogI2VuZGlmCkBAIC05MzMsMzYgKzk4NCwzOCBAQAogICovCiAjaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpICYmICFkZWZpbmVkKEhBVkVfQ09NUElMRVJfVExTKSAmJiAoIWRlZmluZWQoTElCWE1MX1NUQVRJQykgfHwgZGVmaW5lZChMSUJYTUxfU1RBVElDX0ZPUl9ETEwpKQogI2lmIGRlZmluZWQoTElCWE1MX1NUQVRJQ19GT1JfRExMKQotQk9PTCBYTUxDQUxMIHhtbERsbE1haW4oSElOU1RBTkNFIGhpbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHZSZXNlcnZlZCkgCitCT09MIFhNTENBTEwKK3htbERsbE1haW4oSElOU1RBTkNFIGhpbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHZSZXNlcnZlZCkKICNlbHNlCi1CT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoaW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpIAorQk9PTCBXSU5BUEkKK0RsbE1haW4oSElOU1RBTkNFIGhpbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHZSZXNlcnZlZCkKICNlbmRpZgogewotICAgIHN3aXRjaChmZHdSZWFzb24pIHsKLSAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgotCWlmIChnbG9iYWxrZXkgIT0gVExTX09VVF9PRl9JTkRFWEVTKSB7Ci0JICAgIHhtbEdsb2JhbFN0YXRlICpnbG9iYWx2YWwgPSBOVUxMOwotCSAgICB4bWxHbG9iYWxTdGF0ZUNsZWFudXBIZWxwZXJQYXJhbXMgKiBwID0KLQkJKHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyopVGxzR2V0VmFsdWUoZ2xvYmFsa2V5KTsKLQkgICAgZ2xvYmFsdmFsID0gKHhtbEdsb2JhbFN0YXRlICopKHAgPyBwLT5tZW1vcnkgOiBOVUxMKTsKLSAgICAgICAgICAgIGlmIChnbG9iYWx2YWwpIHsKLSAgICAgICAgICAgICAgICB4bWxGcmVlR2xvYmFsU3RhdGUoZ2xvYmFsdmFsKTsKLSAgICAgICAgICAgICAgICBUbHNTZXRWYWx1ZShnbG9iYWxrZXksTlVMTCk7CisgICAgc3dpdGNoIChmZHdSZWFzb24pIHsKKyAgICAgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAgICAgIGlmIChnbG9iYWxrZXkgIT0gVExTX09VVF9PRl9JTkRFWEVTKSB7CisgICAgICAgICAgICAgICAgeG1sR2xvYmFsU3RhdGUgKmdsb2JhbHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgeG1sR2xvYmFsU3RhdGVDbGVhbnVwSGVscGVyUGFyYW1zICpwID0KKyAgICAgICAgICAgICAgICAgICAgKHhtbEdsb2JhbFN0YXRlQ2xlYW51cEhlbHBlclBhcmFtcyAqKQorICAgICAgICAgICAgICAgICAgICBUbHNHZXRWYWx1ZShnbG9iYWxrZXkpOworICAgICAgICAgICAgICAgIGdsb2JhbHZhbCA9ICh4bWxHbG9iYWxTdGF0ZSAqKSAocCA/IHAtPm1lbW9yeSA6IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWx2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sRnJlZUdsb2JhbFN0YXRlKGdsb2JhbHZhbCk7CisgICAgICAgICAgICAgICAgICAgIFRsc1NldFZhbHVlKGdsb2JhbGtleSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjbGVhbnVwX2hlbHBlcnNfY3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBjbGVhbnVwX2hlbHBlcnNfaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfaGVscGVyc19oZWFkID0gcC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHJldi0+bmV4dCA9IHAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLT5uZXh0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5uZXh0LT5wcmV2ID0gcC0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCSAgICBpZiAocCkKLQkgICAgewotCQlFbnRlckNyaXRpY2FsU2VjdGlvbigmY2xlYW51cF9oZWxwZXJzX2NzKTsKLSAgICAgICAgICAgICAgICBpZiAocCA9PSBjbGVhbnVwX2hlbHBlcnNfaGVhZCkKLQkJICAgIGNsZWFudXBfaGVscGVyc19oZWFkID0gcC0+bmV4dDsKLSAgICAgICAgICAgICAgICBlbHNlCi0JCSAgICBwLT5wcmV2LT5uZXh0ID0gcC0+bmV4dDsKLSAgICAgICAgICAgICAgICBpZiAocC0+bmV4dCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwLT5uZXh0LT5wcmV2ID0gcC0+cHJldjsKLQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNsZWFudXBfaGVscGVyc19jcyk7Ci0JCWZyZWUocCk7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS90cmVlLmMgYi90cmVlLmMKaW5kZXggNDMyMDA3ZS4uOGUzOTNkYSAxMDA2NDQKLS0tIGEvdHJlZS5jCisrKyBiL3RyZWUuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgImxpYnhtbC5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIGZvciBtZW1zZXQoKSBvbmx5ICEgKi8KLQorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2lmZGVmIEhBVkVfQ1RZUEVfSAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZW5kaWYKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCi0gKiAJCUZvcndhcmQgZGVjbGFyYXRpb25zCQkJCQkqCisgKgkJRm9yd2FyZCBkZWNsYXJhdGlvbnMJCQkJCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNTUsNyArNTUsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKLSAqIAkJVHJlZSBtZW1vcnkgZXJyb3IgaGFuZGxlcgkJCQkqCisgKgkJVHJlZSBtZW1vcnkgZXJyb3IgaGFuZGxlcgkJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKQEAgLTkyLDYgKzkyLDkgQEAKIAljYXNlIFhNTF9UUkVFX1VOVEVSTUlOQVRFRF9FTlRJVFk6CiAJICAgIG1zZyA9ICJ1bnRlcm1pbmF0ZWQgZW50aXR5IHJlZmVyZW5jZSAlMTVzXG4iOwogCSAgICBicmVhazsKKwljYXNlIFhNTF9UUkVFX05PVF9VVEY4OgorCSAgICBtc2cgPSAic3RyaW5nIGlzIG5vdCBpbiBVVEYtOFxuIjsKKwkgICAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgICAgbXNnID0gInVuZXhwZWN0ZWQgZXJyb3IgbnVtYmVyXG4iOwogICAgIH0KQEAgLTEwMCw3ICsxMDMsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKLSAqIAkJQSBmZXcgc3RhdGljIHZhcmlhYmxlcyBhbmQgbWFjcm9zCQkJKgorICoJCUEgZmV3IHN0YXRpYyB2YXJpYWJsZXMgYW5kIG1hY3JvcwkJCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICN1bmRlZiB4bWxTdHJpbmdUZXh0ICovCkBAIC0xMjAsNyArMTIzLDcgQEAKICAgICAgICAgKG4pLT5sYXN0ID0gTlVMTDsJCQkJCQlcCiAgICAgfSBlbHNlIHsJCQkJCQkJCVwKICAgICAgICAgd2hpbGUgKHVsY2N1ci0+bmV4dCAhPSBOVUxMKSB7CQkJCQlcCi0JICAgICAgIAl1bGNjdXItPnBhcmVudCA9IChuKTsJCQkJCVwKKwkJdWxjY3VyLT5wYXJlbnQgPSAobik7CQkJCQlcCiAJCXVsY2N1ciA9IHVsY2N1ci0+bmV4dDsJCQkJCVwKIAl9CQkJCQkJCQlcCiAJdWxjY3VyLT5wYXJlbnQgPSAobik7CQkJCQkJXApAQCAtMTM1LDEyICsxMzgsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCi0gKgkJRnVuY3Rpb25zIHRvIG1vdmUgdG8gZW50aXRpZXMuYyBvbmNlIHRoZSAJCSoKKyAqCQlGdW5jdGlvbnMgdG8gbW92ZSB0byBlbnRpdGllcy5jIG9uY2UgdGhlCQkqCiAgKgkJQVBJIGZyZWV6ZSBpcyBzbW9vdGhlbiBhbmQgdGhleSBjYW4gYmUgbWFkZSBwdWJsaWMuCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaWJ4bWwvaGFzaC5oPgotIAorCiAjaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogLyoqCiAgKiB4bWxHZXRFbnRpdHlGcm9tRHRkOgpAQCAtMTQ5LDE3ICsxNTIsMTcgQEAKICAqCiAgKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSBEVEQgZW50aXR5IGhhc2ggdGFibGUgYW5kCiAgKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5LCBpZiBmb3VuZC4KLSAqIAorICoKICAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogICovCiBzdGF0aWMgeG1sRW50aXR5UHRyCiB4bWxHZXRFbnRpdHlGcm9tRHRkKHhtbER0ZFB0ciBkdGQsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwotICAgIAorCiAgICAgaWYoKGR0ZCAhPSBOVUxMKSAmJiAoZHRkLT5lbnRpdGllcyAhPSBOVUxMKSkgewogCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGR0ZC0+ZW50aXRpZXM7CiAJcmV0dXJuKCh4bWxFbnRpdHlQdHIpIHhtbEhhc2hMb29rdXAodGFibGUsIG5hbWUpKTsKLSAgICAJLyogcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOyAqLworCS8qIHJldHVybih4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpKTsgKi8KICAgICB9CiAgICAgcmV0dXJuKE5VTEwpOwogfQpAQCAtMTY3LDcgKzE3MCw3IEBACiAgKiB4bWxHZXRQYXJhbWV0ZXJFbnRpdHlGcm9tRHRkOgogICogQGR0ZDogIEEgcG9pbnRlciB0byB0aGUgRFREIHRvIHNlYXJjaAogICogQG5hbWU6ICBUaGUgZW50aXR5IG5hbWUKLSAqIAorICoKICAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIERURCBwYXJhcm1ldGVyIGVudGl0eSBoYXNoIHRhYmxlIGFuZAogICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eSwgaWYgZm91bmQuCiAgKgpAQCAtMTc2LDcgKzE3OSw3IEBACiBzdGF0aWMgeG1sRW50aXR5UHRyCiB4bWxHZXRQYXJhbWV0ZXJFbnRpdHlGcm9tRHRkKHhtbER0ZFB0ciBkdGQsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOwotICAgIAorCiAgICAgaWYgKChkdGQgIT0gTlVMTCkgJiYgKGR0ZC0+cGVudGl0aWVzICE9IE5VTEwpKSB7CiAJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZHRkLT5wZW50aXRpZXM7CiAJcmV0dXJuKCh4bWxFbnRpdHlQdHIpIHhtbEhhc2hMb29rdXAodGFibGUsIG5hbWUpKTsKQEAgLTIzNyw3ICsyNDAsNyBAQAogLyoqCiAgKiB4bWxTcGxpdFFOYW1lMjoKICAqIEBuYW1lOiAgdGhlIGZ1bGwgUU5hbWUKLSAqIEBwcmVmaXg6ICBhIHhtbENoYXIgKiogCisgKiBAcHJlZml4OiAgYSB4bWxDaGFyICoqCiAgKgogICogcGFyc2UgYW4gWE1MIHF1YWxpZmllZCBuYW1lIHN0cmluZwogICoKQEAgLTI3NSw5ICsyNzgsOSBAQAogICAgICAqIHdlIGFyZSBub3QgdHJ5aW5nIHRvIHZhbGlkYXRlIGJ1dCBqdXN0IHRvIGN1dCwgYW5kIHllcyBpdCB3aWxsCiAgICAgICogd29yayBldmVuIGlmIHRoaXMgaXMgYXMgc2V0IG9mIFVURi04IGVuY29kZWQgY2hhcnMKICAgICAgKi8KLSAgICB3aGlsZSAoKG5hbWVbbGVuXSAhPSAwKSAmJiAobmFtZVtsZW5dICE9ICc6JykpIAorICAgIHdoaWxlICgobmFtZVtsZW5dICE9IDApICYmIChuYW1lW2xlbl0gIT0gJzonKSkKIAlsZW4rKzsKLSAgICAKKwogICAgIGlmIChuYW1lW2xlbl0gPT0gMCkKIAlyZXR1cm4oTlVMTCk7CiAKQEAgLTMyNiw5ICszMjksOSBAQAogICAgICAqIHdlIGFyZSBub3QgdHJ5aW5nIHRvIHZhbGlkYXRlIGJ1dCBqdXN0IHRvIGN1dCwgYW5kIHllcyBpdCB3aWxsCiAgICAgICogd29yayBldmVuIGlmIHRoaXMgaXMgYXMgc2V0IG9mIFVURi04IGVuY29kZWQgY2hhcnMKICAgICAgKi8KLSAgICB3aGlsZSAoKG5hbWVbbF0gIT0gMCkgJiYgKG5hbWVbbF0gIT0gJzonKSkgCisgICAgd2hpbGUgKChuYW1lW2xdICE9IDApICYmIChuYW1lW2xdICE9ICc6JykpCiAJbCsrOwotICAgIAorCiAgICAgaWYgKG5hbWVbbF0gPT0gMCkKIAlyZXR1cm4oTlVMTCk7CiAKQEAgLTM0Miw3ICszNDUsNyBAQAogICoJCUNoZWNrIE5hbWUsIE5DTmFtZSBhbmQgUU5hbWUgc3RyaW5ncwkJCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKKwogI2RlZmluZSBDVVJfU0NIQVIocywgbCkgeG1sU3RyaW5nQ3VycmVudENoYXIoTlVMTCwgcywgJmwpCiAKICNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgfHwgZGVmaW5lZCAoTElCWE1MX0hUTUxfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9ET0NCX0VOQUJMRUQpCkBAIC02NjUsMTkgKzY2OCwyMSBAQAogICoJCUFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBvZiBiYXNpYyBzdHJ1Y3R1cmVzCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCisKIC8qKgogICogeG1sU2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZToKICAqIEBzY2hlbWU6ICBhbGxvY2F0aW9uIG1ldGhvZCB0byB1c2UKLSAqIAorICoKICAqIFNldCB0aGUgYnVmZmVyIGFsbG9jYXRpb24gbWV0aG9kLiAgVHlwZXMgYXJlCiAgKiBYTUxfQlVGRkVSX0FMTE9DX0VYQUNUIC0gdXNlIGV4YWN0IHNpemVzLCBrZWVwcyBtZW1vcnkgdXNhZ2UgZG93bgotICogWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCAtIGRvdWJsZSBidWZmZXIgd2hlbiBleHRyYSBuZWVkZWQsIAorICogWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCAtIGRvdWJsZSBidWZmZXIgd2hlbiBleHRyYSBuZWVkZWQsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UKICAqLwogdm9pZAogeG1sU2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZSh4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHNjaGVtZSkgewotICAgIHhtbEJ1ZmZlckFsbG9jU2NoZW1lID0gc2NoZW1lOworICAgIGlmICgoc2NoZW1lID09IFhNTF9CVUZGRVJfQUxMT0NfRVhBQ1QpIHx8CisgICAgICAgIChzY2hlbWUgPT0gWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCkpCisJeG1sQnVmZmVyQWxsb2NTY2hlbWUgPSBzY2hlbWU7CiB9CiAKIC8qKgpAQCAtNjg1LDkgKzY5MCw5IEBACiAgKgogICogVHlwZXMgYXJlCiAgKiBYTUxfQlVGRkVSX0FMTE9DX0VYQUNUIC0gdXNlIGV4YWN0IHNpemVzLCBrZWVwcyBtZW1vcnkgdXNhZ2UgZG93bgotICogWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCAtIGRvdWJsZSBidWZmZXIgd2hlbiBleHRyYSBuZWVkZWQsIAorICogWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVCAtIGRvdWJsZSBidWZmZXIgd2hlbiBleHRyYSBuZWVkZWQsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UKLSAqIAorICoKICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBzY2hlbWUKICAqLwogeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZQpAQCAtNzMwLDkgKzczNSw5IEBACiAgICAgY3VyLT50eXBlID0gWE1MX0xPQ0FMX05BTUVTUEFDRTsKIAogICAgIGlmIChocmVmICE9IE5VTEwpCi0JY3VyLT5ocmVmID0geG1sU3RyZHVwKGhyZWYpOyAKKwljdXItPmhyZWYgPSB4bWxTdHJkdXAoaHJlZik7CiAgICAgaWYgKHByZWZpeCAhPSBOVUxMKQotCWN1ci0+cHJlZml4ID0geG1sU3RyZHVwKHByZWZpeCk7IAorCWN1ci0+cHJlZml4ID0geG1sU3RyZHVwKHByZWZpeCk7CiAKICAgICAvKgogICAgICAqIEFkZCBpdCBhdCB0aGUgZW5kIHRvIHByZXNlcnZlIHBhcnNpbmcgb3JkZXIgLi4uCkBAIC03NDgsMTQgKzc1MywxNCBAQAogCQkoeG1sU3RyRXF1YWwocHJldi0+cHJlZml4LCBjdXItPnByZWZpeCkpKSB7CiAJCXhtbEZyZWVOcyhjdXIpOwogCQlyZXR1cm4oTlVMTCk7Ci0JICAgIH0gICAgCisJICAgIH0KIAkgICAgd2hpbGUgKHByZXYtPm5leHQgIT0gTlVMTCkgewogCSAgICAgICAgcHJldiA9IHByZXYtPm5leHQ7CiAJCWlmICgoKHByZXYtPnByZWZpeCA9PSBOVUxMKSAmJiAoY3VyLT5wcmVmaXggPT0gTlVMTCkpIHx8CiAJCSAgICAoeG1sU3RyRXF1YWwocHJldi0+cHJlZml4LCBjdXItPnByZWZpeCkpKSB7CiAJCSAgICB4bWxGcmVlTnMoY3VyKTsKIAkJICAgIHJldHVybihOVUxMKTsKLQkJfSAgICAKKwkJfQogCSAgICB9CiAJICAgIHByZXYtPm5leHQgPSBjdXI7CiAJfQpAQCAtODY0LDExICs4NjksMTEgQEAKICAgICBjdXItPnR5cGUgPSBYTUxfRFREX05PREU7CiAKICAgICBpZiAobmFtZSAhPSBOVUxMKQotCWN1ci0+bmFtZSA9IHhtbFN0cmR1cChuYW1lKTsgCisJY3VyLT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwogICAgIGlmIChFeHRlcm5hbElEICE9IE5VTEwpCi0JY3VyLT5FeHRlcm5hbElEID0geG1sU3RyZHVwKEV4dGVybmFsSUQpOyAKKwljdXItPkV4dGVybmFsSUQgPSB4bWxTdHJkdXAoRXh0ZXJuYWxJRCk7CiAgICAgaWYgKFN5c3RlbUlEICE9IE5VTEwpCi0JY3VyLT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7IAorCWN1ci0+U3lzdGVtSUQgPSB4bWxTdHJkdXAoU3lzdGVtSUQpOwogICAgIGlmIChkb2MgIT0gTlVMTCkKIAlkb2MtPmV4dFN1YnNldCA9IGN1cjsKICAgICBjdXItPmRvYyA9IGRvYzsKQEAgLTk0Niw3ICs5NTEsNyBAQAogCX0KICAgICB9CiAgICAgaWYgKEV4dGVybmFsSUQgIT0gTlVMTCkgewotCWN1ci0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsgCisJY3VyLT5FeHRlcm5hbElEID0geG1sU3RyZHVwKEV4dGVybmFsSUQpOwogCWlmIChjdXItPkV4dGVybmFsSUQgID09IE5VTEwpIHsKIAkgICAgeG1sVHJlZUVyck1lbW9yeSgiYnVpbGRpbmcgaW50ZXJuYWwgc3Vic2V0Iik7CiAJICAgIGlmIChjdXItPm5hbWUgIT0gTlVMTCkKQEAgLTk1Niw3ICs5NjEsNyBAQAogCX0KICAgICB9CiAgICAgaWYgKFN5c3RlbUlEICE9IE5VTEwpIHsKLQljdXItPlN5c3RlbUlEID0geG1sU3RyZHVwKFN5c3RlbUlEKTsgCisJY3VyLT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7CiAJaWYgKGN1ci0+U3lzdGVtSUQgPT0gTlVMTCkgewogCSAgICB4bWxUcmVlRXJyTWVtb3J5KCJidWlsZGluZyBpbnRlcm5hbCBzdWJzZXQiKTsKIAkgICAgaWYgKGN1ci0+bmFtZSAhPSBOVUxMKQpAQCAtMTAxOSw3ICsxMDI0LDcgQEAKICAqIGN1cnJlbnQgc2NvcGUKICAqLwogI2RlZmluZSBESUNUX0ZSRUUoc3RyKQkJCQkJCVwKLQlpZiAoKHN0cikgJiYgKCghZGljdCkgfHwgCQkJCVwKKwlpZiAoKHN0cikgJiYgKCghZGljdCkgfHwJCQkJXAogCSAgICAoeG1sRGljdE93bnMoZGljdCwgKGNvbnN0IHhtbENoYXIgKikoc3RyKSkgPT0gMCkpKQlcCiAJICAgIHhtbEZyZWUoKGNoYXIgKikoc3RyKSk7CiAKQEAgLTExMDIsNyArMTEwNyw3IEBACiAgICAgLyogVE9ETyAhISEgKi8KICAgICBpZiAoY3VyLT5ub3RhdGlvbnMgIT0gTlVMTCkKICAgICAgICAgeG1sRnJlZU5vdGF0aW9uVGFibGUoKHhtbE5vdGF0aW9uVGFibGVQdHIpIGN1ci0+bm90YXRpb25zKTsKLSAgICAKKwogICAgIGlmIChjdXItPmVsZW1lbnRzICE9IE5VTEwpCiAgICAgICAgIHhtbEZyZWVFbGVtZW50VGFibGUoKHhtbEVsZW1lbnRUYWJsZVB0cikgY3VyLT5lbGVtZW50cyk7CiAgICAgaWYgKGN1ci0+YXR0cmlidXRlcyAhPSBOVUxMKQpAQCAtMTE0MSwxNSArMTE0NiwxNyBAQAogICAgIG1lbXNldChjdXIsIDAsIHNpemVvZih4bWxEb2MpKTsKICAgICBjdXItPnR5cGUgPSBYTUxfRE9DVU1FTlRfTk9ERTsKIAotICAgIGN1ci0+dmVyc2lvbiA9IHhtbFN0cmR1cCh2ZXJzaW9uKTsgCisgICAgY3VyLT52ZXJzaW9uID0geG1sU3RyZHVwKHZlcnNpb24pOwogICAgIGlmIChjdXItPnZlcnNpb24gPT0gTlVMTCkgewogCXhtbFRyZWVFcnJNZW1vcnkoImJ1aWxkaW5nIGRvYyIpOwogCXhtbEZyZWUoY3VyKTsKLSAgICAJcmV0dXJuKE5VTEwpOworCXJldHVybihOVUxMKTsKICAgICB9CiAgICAgY3VyLT5zdGFuZGFsb25lID0gLTE7CiAgICAgY3VyLT5jb21wcmVzc2lvbiA9IC0xOyAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KICAgICBjdXItPmRvYyA9IGN1cjsKKyAgICBjdXItPnBhcnNlRmxhZ3MgPSAwOworICAgIGN1ci0+cHJvcGVydGllcyA9IFhNTF9ET0NfVVNFUkJVSUxUOwogICAgIC8qCiAgICAgICogVGhlIGluIG1lbW9yeSBlbmNvZGluZyBpcyBhbHdheXMgVVRGOAogICAgICAqIFRoaXMgZmllbGQgd2lsbCBuZXZlciBjaGFuZ2UgYW5kIHdvdWxkCkBAIC0xMjc3LDcgKzEyODQsNyBAQAogCQllbHNlCiAJCSAgICB0bXAgPSAwOwogCQl3aGlsZSAodG1wICE9ICc7JykgeyAvKiBOb24gaW5wdXQgY29uc3VtaW5nIGxvb3AgKi8KLQkJICAgIGlmICgodG1wID49ICcwJykgJiYgKHRtcCA8PSAnOScpKSAKKwkJICAgIGlmICgodG1wID49ICcwJykgJiYgKHRtcCA8PSAnOScpKQogCQkJY2hhcnZhbCA9IGNoYXJ2YWwgKiAxNiArICh0bXAgLSAnMCcpOwogCQkgICAgZWxzZSBpZiAoKHRtcCA+PSAnYScpICYmICh0bXAgPD0gJ2YnKSkKIAkJCWNoYXJ2YWwgPSBjaGFydmFsICogMTYgKyAodG1wIC0gJ2EnKSArIDEwOwpAQCAtMTMwNSw3ICsxMzEyLDcgQEAKIAkJZWxzZQogCQkgICAgdG1wID0gMDsKIAkJd2hpbGUgKHRtcCAhPSAnOycpIHsgLyogTm9uIGlucHV0IGNvbnN1bWluZyBsb29wcyAqLwotCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpIAorCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpCiAJCQljaGFydmFsID0gY2hhcnZhbCAqIDEwICsgKHRtcCAtICcwJyk7CiAJCSAgICBlbHNlIHsKIAkJCXhtbFRyZWVFcnIoWE1MX1RSRUVfSU5WQUxJRF9ERUMsICh4bWxOb2RlUHRyKSBkb2MsCkBAIC0xMzUwLDcgKzEzNTcsNyBAQAogCQkJICAgIGxhc3QgPSB4bWxBZGROZXh0U2libGluZyhsYXN0LCBub2RlKTsKIAkJCX0gZWxzZQogCQkJICAgIHhtbE5vZGVBZGRDb250ZW50KGxhc3QsIGVudC0+Y29udGVudCk7Ci0JCQkgICAgCisKIAkJICAgIH0gZWxzZSB7CiAJCQkvKgogCQkJICogQ3JlYXRlIGEgbmV3IFJFRkVSRU5DRV9SRUYgbm9kZQpAQCAtMTQ3MSw3ICsxNDc4LDcgQEAKIAkJY3VyICs9IDM7CiAJCXRtcCA9ICpjdXI7CiAJCXdoaWxlICh0bXAgIT0gJzsnKSB7IC8qIE5vbiBpbnB1dCBjb25zdW1pbmcgbG9vcCAqLwotCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpIAorCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpCiAJCQljaGFydmFsID0gY2hhcnZhbCAqIDE2ICsgKHRtcCAtICcwJyk7CiAJCSAgICBlbHNlIGlmICgodG1wID49ICdhJykgJiYgKHRtcCA8PSAnZicpKQogCQkJY2hhcnZhbCA9IGNoYXJ2YWwgKiAxNiArICh0bXAgLSAnYScpICsgMTA7CkBAIC0xNDkzLDcgKzE1MDAsNyBAQAogCQljdXIgKz0gMjsKIAkJdG1wID0gKmN1cjsKIAkJd2hpbGUgKHRtcCAhPSAnOycpIHsgLyogTm9uIGlucHV0IGNvbnN1bWluZyBsb29wcyAqLwotCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpIAorCQkgICAgaWYgKCh0bXAgPj0gJzAnKSAmJiAodG1wIDw9ICc5JykpCiAJCQljaGFydmFsID0gY2hhcnZhbCAqIDEwICsgKHRtcCAtICcwJyk7CiAJCSAgICBlbHNlIHsKIAkJCXhtbFRyZWVFcnIoWE1MX1RSRUVfSU5WQUxJRF9ERUMsICh4bWxOb2RlUHRyKSBkb2MsCkBAIC0xNTM1LDcgKzE1NDIsNyBAQAogCQkJICAgIGxhc3QgPSB4bWxBZGROZXh0U2libGluZyhsYXN0LCBub2RlKTsKIAkJCX0gZWxzZQogCQkJICAgIHhtbE5vZGVBZGRDb250ZW50KGxhc3QsIGVudC0+Y29udGVudCk7Ci0JCQkgICAgCisKIAkJICAgIH0gZWxzZSB7CiAJCQkvKgogCQkJICogQ3JlYXRlIGEgbmV3IFJFRkVSRU5DRV9SRUYgbm9kZQpAQCAtMTc4MCw3ICsxNzg3LDkgQEAKICAgICB4bWxEb2NQdHIgZG9jID0gTlVMTDsKIAogICAgIGlmICgobm9kZSAhPSBOVUxMKSAmJiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKSkgewotICAgICAgICBpZiAoZWF0bmFtZSA9PSAxKQorICAgICAgICBpZiAoKGVhdG5hbWUgPT0gMSkgJiYKKwkgICAgKChub2RlLT5kb2MgPT0gTlVMTCkgfHwKKwkgICAgICghKHhtbERpY3RPd25zKG5vZGUtPmRvYy0+ZGljdCwgbmFtZSkpKSkpCiAgICAgICAgICAgICB4bWxGcmVlKCh4bWxDaGFyICopIG5hbWUpOwogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIH0KQEAgLTE3OTAsNyArMTc5OSw5IEBACiAgICAgICovCiAgICAgY3VyID0gKHhtbEF0dHJQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sQXR0cikpOwogICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICBpZiAoZWF0bmFtZSA9PSAxKQorICAgICAgICBpZiAoKGVhdG5hbWUgPT0gMSkgJiYKKwkgICAgKChub2RlLT5kb2MgPT0gTlVMTCkgfHwKKwkgICAgICghKHhtbERpY3RPd25zKG5vZGUtPmRvYy0+ZGljdCwgbmFtZSkpKSkpCiAgICAgICAgICAgICB4bWxGcmVlKCh4bWxDaGFyICopIG5hbWUpOwogICAgICAgICB4bWxUcmVlRXJyTWVtb3J5KCJidWlsZGluZyBhdHRyaWJ1dGUiKTsKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTE4MTQsMTEgKzE4MjUsMTUgQEAKICAgICAgICAgY3VyLT5uYW1lID0gbmFtZTsKIAogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIHhtbENoYXIgKmJ1ZmZlcjsKICAgICAgICAgeG1sTm9kZVB0ciB0bXA7CiAKLSAgICAgICAgYnVmZmVyID0geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoZG9jLCB2YWx1ZSk7Ci0gICAgICAgIGN1ci0+Y2hpbGRyZW4gPSB4bWxTdHJpbmdHZXROb2RlTGlzdChkb2MsIGJ1ZmZlcik7CisgICAgICAgIGlmKCF4bWxDaGVja1VURjgodmFsdWUpKSB7CisgICAgICAgICAgICB4bWxUcmVlRXJyKFhNTF9UUkVFX05PVF9VVEY4LCAoeG1sTm9kZVB0cikgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIGlmIChkb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBkb2MtPmVuY29kaW5nID0geG1sU3RyZHVwKEJBRF9DQVNUICJJU08tODg1OS0xIik7CisgICAgICAgIH0KKyAgICAgICAgY3VyLT5jaGlsZHJlbiA9IHhtbE5ld0RvY1RleHQoZG9jLCB2YWx1ZSk7CiAgICAgICAgIGN1ci0+bGFzdCA9IE5VTEw7CiAgICAgICAgIHRtcCA9IGN1ci0+Y2hpbGRyZW47CiAgICAgICAgIHdoaWxlICh0bXAgIT0gTlVMTCkgewpAQCAtMTgyNyw3ICsxODQyLDYgQEAKICAgICAgICAgICAgICAgICBjdXItPmxhc3QgPSB0bXA7CiAgICAgICAgICAgICB0bXAgPSB0bXAtPm5leHQ7CiAgICAgICAgIH0KLSAgICAgICAgeG1sRnJlZShidWZmZXIpOwogICAgIH0KIAogICAgIC8qCkBAIC0xOTI3LDcgKzE5NDEsNyBAQAogCXJldHVybihOVUxMKTsKICAgICB9CiAKLQlyZXR1cm4geG1sTmV3UHJvcEludGVybmFsKG5vZGUsIG5zLCBuYW1lLCB2YWx1ZSwgMSk7CisgICAgcmV0dXJuIHhtbE5ld1Byb3BJbnRlcm5hbChub2RlLCBucywgbmFtZSwgdmFsdWUsIDEpOwogfQogCiAvKioKQEAgLTE5NjYsNyArMTk4MCw3IEBACiAJY3VyLT5uYW1lID0geG1sRGljdExvb2t1cChkb2MtPmRpY3QsIG5hbWUsIC0xKTsKICAgICBlbHNlCiAJY3VyLT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwotICAgIGN1ci0+ZG9jID0gZG9jOyAKKyAgICBjdXItPmRvYyA9IGRvYzsKICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewogCXhtbE5vZGVQdHIgdG1wOwogCkBAIC0yMTczLDcgKzIxODcsNyBAQAogICAgIH0KICAgICBtZW1zZXQoY3VyLCAwLCBzaXplb2YoeG1sTm9kZSkpOwogICAgIGN1ci0+dHlwZSA9IFhNTF9FTEVNRU5UX05PREU7Ci0gICAgCisKICAgICBjdXItPm5hbWUgPSB4bWxTdHJkdXAobmFtZSk7CiAgICAgY3VyLT5ucyA9IG5zOwogCkBAIC0yMjEwLDEzICsyMjI0LDEzIEBACiAgICAgICovCiAgICAgY3VyID0gKHhtbE5vZGVQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sTm9kZSkpOwogICAgIGlmIChjdXIgPT0gTlVMTCkgewotCXhtbEZyZWUobmFtZSk7CiAJeG1sVHJlZUVyck1lbW9yeSgiYnVpbGRpbmcgbm9kZSIpOworCS8qIHdlIGNhbid0IGNoZWNrIGhlcmUgdGhhdCBuYW1lIGNvbWVzIGZyb20gdGhlIGRvYyBkaWN0aW9ubmFyeSAqLwogCXJldHVybihOVUxMKTsKICAgICB9CiAgICAgbWVtc2V0KGN1ciwgMCwgc2l6ZW9mKHhtbE5vZGUpKTsKICAgICBjdXItPnR5cGUgPSBYTUxfRUxFTUVOVF9OT0RFOwotICAgIAorCiAgICAgY3VyLT5uYW1lID0gbmFtZTsKICAgICBjdXItPm5zID0gbnM7CiAKQEAgLTIyOTAsNiArMjMwNCwxMSBAQAogCSAgICBjdXItPmNoaWxkcmVuID0geG1sU3RyaW5nR2V0Tm9kZUxpc3QoZG9jLCBjb250ZW50KTsKIAkgICAgVVBEQVRFX0xBU1RfQ0hJTERfQU5EX1BBUkVOVChjdXIpCiAJfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGlmIG5hbWUgZG9uJ3QgY29tZSBmcm9tIHRoZSBkb2MgZGljdGlvbm5hcnkgZnJlZSBpdCBoZXJlICovCisgICAgICAgIGlmICgobmFtZSAhPSBOVUxMKSAmJiAoZG9jICE9IE5VTEwpICYmCisJICAgICghKHhtbERpY3RPd25zKGRvYy0+ZGljdCwgbmFtZSkpKSkKKwkgICAgeG1sRnJlZShuYW1lKTsKICAgICB9CiAgICAgcmV0dXJuKGN1cik7CiB9CkBAIC0yMzk5LDkgKzI0MTgsOSBAQAogICogYSBjaGlsZCBURVhUIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBAY29udGVudC4KICAqIE5PVEU6IFVzZSB4bWxOZXdDaGlsZCgpIGlmIEBjb250ZW50IHdpbGwgY29udGFpbiBlbnRpdGllcyB0aGF0IG5lZWQgdG8gYmUKICAqIHByZXNlcnZlZC4gVXNlIHRoaXMgZnVuY3Rpb24sIHhtbE5ld1RleHRDaGlsZCgpLCBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICogcmVzZXJ2ZWQgWE1MIGNoYXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIEBjb250ZW50LCBzdWNoIGFzIHRoZSBhbXBlcnNhbmQsIAotICogZ3JlYXRlci10aGFuIG9yIGxlc3MtdGhhbiBzaWducywgYXJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgYnkgdGhlaXIgWE1MIAotICogZXNjYXBlZCBlbnRpdHkgcmVwcmVzZW50YXRpb25zLiAKKyAqIHJlc2VydmVkIFhNTCBjaGFycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiBAY29udGVudCwgc3VjaCBhcyB0aGUgYW1wZXJzYW5kLAorICogZ3JlYXRlci10aGFuIG9yIGxlc3MtdGhhbiBzaWducywgYXJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgYnkgdGhlaXIgWE1MCisgKiBlc2NhcGVkIGVudGl0eSByZXByZXNlbnRhdGlvbnMuCiAgKgogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBub2RlIG9iamVjdC4KICAqLwpAQCAtMjg0OSwxNCArMjg2OCwxNCBAQAogCiAvKioKICAqIHhtbEFkZFByb3BTaWJsaW5nOgotICogQHByZXY6ICB0aGUgYXR0cmlidXRlIHRvIHdoaWNoIEBwcm9wIGlzIGFkZGVkIGFmdGVyIAorICogQHByZXY6ICB0aGUgYXR0cmlidXRlIHRvIHdoaWNoIEBwcm9wIGlzIGFkZGVkIGFmdGVyCiAgKiBAY3VyOiAgIHRoZSBiYXNlIGF0dHJpYnV0ZSBwYXNzZWQgdG8gY2FsbGluZyBmdW5jdGlvbgogICogQHByb3A6ICB0aGUgbmV3IGF0dHJpYnV0ZQogICoKICAqIEFkZCBhIG5ldyBhdHRyaWJ1dGUgYWZ0ZXIgQHByZXYgdXNpbmcgQGN1ciBhcyBiYXNlIGF0dHJpYnV0ZS4KICAqIFdoZW4gaW5zZXJ0aW5nIGJlZm9yZSBAY3VyLCBAcHJldiBpcyBwYXNzZWQgYXMgQGN1ci0+cHJldi4KICAqIFdoZW4gaW5zZXJ0aW5nIGFmdGVyIEBjdXIsIEBwcmV2IGlzIHBhc3NlZCBhcyBAY3VyLgotICogSWYgYW4gZXhpc3RpbmcgYXR0cmlidXRlIGlzIGZvdW5kIGl0IGlzIGRldHJveWVkIHByaW9yIHRvIGFkZGluZyBAcHJvcC4gCisgKiBJZiBhbiBleGlzdGluZyBhdHRyaWJ1dGUgaXMgZm91bmQgaXQgaXMgZGV0cm95ZWQgcHJpb3IgdG8gYWRkaW5nIEBwcm9wLgogICoKICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBiZWluZyBpbnNlcnRlZCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiAgKi8KQEAgLTI5MDYsNyArMjkyNSw3IEBACiAgKiBmaXJzdCB1bmxpbmtlZCBmcm9tIGl0cyBleGlzdGluZyBjb250ZXh0LgogICogQXMgYSByZXN1bHQgb2YgdGV4dCBtZXJnaW5nIEBlbGVtIG1heSBiZSBmcmVlZC4KICAqIElmIHRoZSBuZXcgbm9kZSBpcyBBVFRSSUJVVEUsIGl0IGlzIGFkZGVkIGludG8gcHJvcGVydGllcyBpbnN0ZWFkIG9mIGNoaWxkcmVuLgotICogSWYgdGhlcmUgaXMgYW4gYXR0cmlidXRlIHdpdGggZXF1YWwgbmFtZSwgaXQgaXMgZmlyc3QgZGVzdHJveWVkLiAKKyAqIElmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSB3aXRoIGVxdWFsIG5hbWUsIGl0IGlzIGZpcnN0IGRlc3Ryb3llZC4KICAqCiAgKiBSZXR1cm5zIHRoZSBuZXcgbm9kZSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiAgKi8KQEAgLTI5ODQsNyArMzAwMyw3IEBACiAgKiBJZiB0aGUgbmV3IG5vZGUgd2FzIGFscmVhZHkgaW5zZXJ0ZWQgaW4gYSBkb2N1bWVudCBpdCBpcwogICogZmlyc3QgdW5saW5rZWQgZnJvbSBpdHMgZXhpc3RpbmcgY29udGV4dC4KICAqIElmIHRoZSBuZXcgbm9kZSBpcyBBVFRSSUJVVEUsIGl0IGlzIGFkZGVkIGludG8gcHJvcGVydGllcyBpbnN0ZWFkIG9mIGNoaWxkcmVuLgotICogSWYgdGhlcmUgaXMgYW4gYXR0cmlidXRlIHdpdGggZXF1YWwgbmFtZSwgaXQgaXMgZmlyc3QgZGVzdHJveWVkLiAKKyAqIElmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSB3aXRoIGVxdWFsIG5hbWUsIGl0IGlzIGZpcnN0IGRlc3Ryb3llZC4KICAqCiAgKiBSZXR1cm5zIHRoZSBuZXcgbm9kZSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiAgKi8KQEAgLTMwODgsNyArMzEwNyw3IEBACiAgICAgICogQ29uc3RhbnQgdGltZSBpcyB3ZSBjYW4gcmVseSBvbiB0aGUgLT5wYXJlbnQtPmxhc3QgdG8gZmluZAogICAgICAqIHRoZSBsYXN0IHNpYmxpbmcuCiAgICAgICovCi0gICAgaWYgKChjdXItPnR5cGUgIT0gWE1MX0FUVFJJQlVURV9OT0RFKSAmJiAoY3VyLT5wYXJlbnQgIT0gTlVMTCkgJiYgCisgICAgaWYgKChjdXItPnR5cGUgIT0gWE1MX0FUVFJJQlVURV9OT0RFKSAmJiAoY3VyLT5wYXJlbnQgIT0gTlVMTCkgJiYKIAkoY3VyLT5wYXJlbnQtPmNoaWxkcmVuICE9IE5VTEwpICYmCiAJKGN1ci0+cGFyZW50LT5sYXN0ICE9IE5VTEwpICYmCiAJKGN1ci0+cGFyZW50LT5sYXN0LT5uZXh0ID09IE5VTEwpKSB7CkBAIC0zMTcwLDEwICszMTg5LDEwIEBACiAJLyoKIAkgKiBJZiBjdXIgYW5kIHBhcmVudC0+bGFzdCBib3RoIGFyZSBURVhUIG5vZGVzLCB0aGVuIG1lcmdlIHRoZW0uCiAJICovCi0JaWYgKChjdXItPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkgJiYgCisJaWYgKChjdXItPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkgJiYKIAkgICAgKHBhcmVudC0+bGFzdC0+dHlwZSA9PSBYTUxfVEVYVF9OT0RFKSAmJgogCSAgICAoY3VyLT5uYW1lID09IHBhcmVudC0+bGFzdC0+bmFtZSkpIHsKLSAgICAJICAgIHhtbE5vZGVBZGRDb250ZW50KHBhcmVudC0+bGFzdCwgY3VyLT5jb250ZW50KTsKKwkgICAgeG1sTm9kZUFkZENvbnRlbnQocGFyZW50LT5sYXN0LCBjdXItPmNvbnRlbnQpOwogCSAgICAvKgogCSAgICAgKiBpZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCBub3RoaW5nIG1vcmUgdG8gYmUgZG9uZS4KIAkgICAgICovCkBAIC0zMTk3LDcgKzMyMTYsMTAgQEAKICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgIH0KICAgICBjdXItPnBhcmVudCA9IHBhcmVudDsKLSAgICBjdXItPmRvYyA9IHBhcmVudC0+ZG9jOyAvKiB0aGUgcGFyZW50IG1heSBub3QgYmUgbGlua2VkIHRvIGEgZG9jICEgKi8KKyAgICAvKiB0aGUgcGFyZW50IG1heSBub3QgYmUgbGlua2VkIHRvIGEgZG9jICEgKi8KKyAgICBpZiAoY3VyLT5kb2MgIT0gcGFyZW50LT5kb2MpIHsKKyAgICAgICAgeG1sU2V0VHJlZURvYyhjdXIsIHBhcmVudC0+ZG9jKTsKKyAgICB9CiAgICAgcGFyZW50LT5sYXN0ID0gY3VyOwogCiAgICAgcmV0dXJuKGN1cik7CkBAIC0zMjExLDcgKzMyMzMsNyBAQAogICogQWRkIGEgbmV3IG5vZGUgdG8gQHBhcmVudCwgYXQgdGhlIGVuZCBvZiB0aGUgY2hpbGQgKG9yIHByb3BlcnR5KSBsaXN0CiAgKiBtZXJnaW5nIGFkamFjZW50IFRFWFQgbm9kZXMgKGluIHdoaWNoIGNhc2UgQGN1ciBpcyBmcmVlZCkKICAqIElmIHRoZSBuZXcgbm9kZSBpcyBBVFRSSUJVVEUsIGl0IGlzIGFkZGVkIGludG8gcHJvcGVydGllcyBpbnN0ZWFkIG9mIGNoaWxkcmVuLgotICogSWYgdGhlcmUgaXMgYW4gYXR0cmlidXRlIHdpdGggZXF1YWwgbmFtZSwgaXQgaXMgZmlyc3QgZGVzdHJveWVkLiAKKyAqIElmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSB3aXRoIGVxdWFsIG5hbWUsIGl0IGlzIGZpcnN0IGRlc3Ryb3llZC4KICAqCiAgKiBSZXR1cm5zIHRoZSBjaGlsZCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiAgKi8KQEAgLTMyOTAsOSArMzMxMiw3IEBACiAgICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpIHsKIAkJaWYgKHBhcmVudC0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKQogCQkJcmV0dXJuKE5VTEwpOwotCWlmIChwYXJlbnQtPnByb3BlcnRpZXMgPT0gTlVMTCkgewotCSAgICBwYXJlbnQtPnByb3BlcnRpZXMgPSAoeG1sQXR0clB0cikgY3VyOwotCX0gZWxzZSB7CisJaWYgKHBhcmVudC0+cHJvcGVydGllcyAhPSBOVUxMKSB7CiAJICAgIC8qIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzICovCiAJICAgIHhtbEF0dHJQdHIgbGFzdGF0dHI7CiAKQEAgLTMzMDcsOCArMzMyNywxMyBAQAogCSAgICB9CiAJCWlmIChsYXN0YXR0ciA9PSAoeG1sQXR0clB0cikgY3VyKQogCQkJcmV0dXJuKGN1cik7CisKKwl9CisJaWYgKHBhcmVudC0+cHJvcGVydGllcyA9PSBOVUxMKSB7CisJICAgIHBhcmVudC0+cHJvcGVydGllcyA9ICh4bWxBdHRyUHRyKSBjdXI7CisJfSBlbHNlIHsKIAkgICAgLyogZmluZCB0aGUgZW5kICovCi0JICAgIGxhc3RhdHRyID0gcGFyZW50LT5wcm9wZXJ0aWVzOworCSAgICB4bWxBdHRyUHRyIGxhc3RhdHRyID0gcGFyZW50LT5wcm9wZXJ0aWVzOwogCSAgICB3aGlsZSAobGFzdGF0dHItPm5leHQgIT0gTlVMTCkgewogCQlsYXN0YXR0ciA9IGxhc3RhdHRyLT5uZXh0OwogCSAgICB9CkBAIC0zMzQ4LDYgKzMzNzMsMTk5IEBACiAgICAgcmV0dXJuKHBhcmVudC0+bGFzdCk7CiB9CiAKKyNpZmRlZiBMSUJYTUxfVFJFRV9FTkFCTEVECisvKgorICogNSBpbnRlcmZhY2VzIGZyb20gRE9NIEVsZW1lbnRUcmF2ZXJzYWwKKyAqLworCisvKioKKyAqIHhtbENoaWxkRWxlbWVudENvdW50OgorICogQHBhcmVudDogdGhlIHBhcmVudCBub2RlCisgKgorICogRmluZHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIG9mIHRoYXQgZWxlbWVudCB3aGljaCBhcmUKKyAqIGVsZW1lbnQgbm9kZXMuCisgKiBOb3RlIHRoZSBoYW5kbGluZyBvZiBlbnRpdGllcyByZWZlcmVuY2VzIGlzIGRpZmZlcmVudCB0aGFuIGluCisgKiB0aGUgVzNDIERPTSBlbGVtZW50IHRyYXZlcnNhbCBzcGVjIHNpbmNlIHdlIGRvbid0IGhhdmUgYmFjayByZWZlcmVuY2UKKyAqIGZyb20gZW50aXRpZXMgY29udGVudCB0byBlbnRpdGllcyByZWZlcmVuY2VzLgorICoKKyAqIFJldHVybnMgdGhlIGNvdW50IG9mIGVsZW1lbnQgY2hpbGQgb3IgMCBpZiBub3QgYXZhaWxhYmxlCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3htbENoaWxkRWxlbWVudENvdW50KHhtbE5vZGVQdHIgcGFyZW50KSB7CisgICAgdW5zaWduZWQgbG9uZyByZXQgPSAwOworICAgIHhtbE5vZGVQdHIgY3VyID0gTlVMTDsKKworICAgIGlmIChwYXJlbnQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKDApOworICAgIHN3aXRjaCAocGFyZW50LT50eXBlKSB7CisgICAgICAgIGNhc2UgWE1MX0VMRU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfRU5USVRZX05PREU6CisgICAgICAgIGNhc2UgWE1MX0RPQ1VNRU5UX05PREU6CisgICAgICAgIGNhc2UgWE1MX0hUTUxfRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgIGN1ciA9IHBhcmVudC0+Y2hpbGRyZW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkKKyAgICAgICAgICAgIHJldCsrOworICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisgICAgfQorICAgIHJldHVybihyZXQpOworfQorCisvKioKKyAqIHhtbEZpcnN0RWxlbWVudENoaWxkOgorICogQHBhcmVudDogdGhlIHBhcmVudCBub2RlCisgKgorICogRmluZHMgdGhlIGZpcnN0IGNoaWxkIG5vZGUgb2YgdGhhdCBlbGVtZW50IHdoaWNoIGlzIGEgRWxlbWVudCBub2RlCisgKiBOb3RlIHRoZSBoYW5kbGluZyBvZiBlbnRpdGllcyByZWZlcmVuY2VzIGlzIGRpZmZlcmVudCB0aGFuIGluCisgKiB0aGUgVzNDIERPTSBlbGVtZW50IHRyYXZlcnNhbCBzcGVjIHNpbmNlIHdlIGRvbid0IGhhdmUgYmFjayByZWZlcmVuY2UKKyAqIGZyb20gZW50aXRpZXMgY29udGVudCB0byBlbnRpdGllcyByZWZlcmVuY2VzLgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgY2hpbGQgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlCisgKi8KK3htbE5vZGVQdHIKK3htbEZpcnN0RWxlbWVudENoaWxkKHhtbE5vZGVQdHIgcGFyZW50KSB7CisgICAgeG1sTm9kZVB0ciBjdXIgPSBOVUxMOworCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgc3dpdGNoIChwYXJlbnQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgorICAgICAgICBjYXNlIFhNTF9FTlRJVFlfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfRE9DVU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgY3VyID0gcGFyZW50LT5jaGlsZHJlbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKQorICAgICAgICAgICAgcmV0dXJuKGN1cik7CisgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuKE5VTEwpOworfQorCisvKioKKyAqIHhtbExhc3RFbGVtZW50Q2hpbGQ6CisgKiBAcGFyZW50OiB0aGUgcGFyZW50IG5vZGUKKyAqCisgKiBGaW5kcyB0aGUgbGFzdCBjaGlsZCBub2RlIG9mIHRoYXQgZWxlbWVudCB3aGljaCBpcyBhIEVsZW1lbnQgbm9kZQorICogTm90ZSB0aGUgaGFuZGxpbmcgb2YgZW50aXRpZXMgcmVmZXJlbmNlcyBpcyBkaWZmZXJlbnQgdGhhbiBpbgorICogdGhlIFczQyBET00gZWxlbWVudCB0cmF2ZXJzYWwgc3BlYyBzaW5jZSB3ZSBkb24ndCBoYXZlIGJhY2sgcmVmZXJlbmNlCisgKiBmcm9tIGVudGl0aWVzIGNvbnRlbnQgdG8gZW50aXRpZXMgcmVmZXJlbmNlcy4KKyAqCisgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgY2hpbGQgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlCisgKi8KK3htbE5vZGVQdHIKK3htbExhc3RFbGVtZW50Q2hpbGQoeG1sTm9kZVB0ciBwYXJlbnQpIHsKKyAgICB4bWxOb2RlUHRyIGN1ciA9IE5VTEw7CisKKyAgICBpZiAocGFyZW50ID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBzd2l0Y2ggKHBhcmVudC0+dHlwZSkgeworICAgICAgICBjYXNlIFhNTF9FTEVNRU5UX05PREU6CisgICAgICAgIGNhc2UgWE1MX0VOVElUWV9OT0RFOgorICAgICAgICBjYXNlIFhNTF9ET0NVTUVOVF9OT0RFOgorICAgICAgICBjYXNlIFhNTF9IVE1MX0RPQ1VNRU5UX05PREU6CisgICAgICAgICAgICBjdXIgPSBwYXJlbnQtPmxhc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkKKyAgICAgICAgICAgIHJldHVybihjdXIpOworICAgICAgICBjdXIgPSBjdXItPnByZXY7CisgICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworLyoqCisgKiB4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nOgorICogQG5vZGU6IHRoZSBjdXJyZW50IG5vZGUKKyAqCisgKiBGaW5kcyB0aGUgZmlyc3QgY2xvc2VzdCBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBub2RlIHdoaWNoIGlzIGFuCisgKiBlbGVtZW50IG5vZGUuCisgKiBOb3RlIHRoZSBoYW5kbGluZyBvZiBlbnRpdGllcyByZWZlcmVuY2VzIGlzIGRpZmZlcmVudCB0aGFuIGluCisgKiB0aGUgVzNDIERPTSBlbGVtZW50IHRyYXZlcnNhbCBzcGVjIHNpbmNlIHdlIGRvbid0IGhhdmUgYmFjayByZWZlcmVuY2UKKyAqIGZyb20gZW50aXRpZXMgY29udGVudCB0byBlbnRpdGllcyByZWZlcmVuY2VzLgorICoKKyAqIFJldHVybnMgdGhlIHByZXZpb3VzIGVsZW1lbnQgc2libGluZyBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKyAqLworeG1sTm9kZVB0cgoreG1sUHJldmlvdXNFbGVtZW50U2libGluZyh4bWxOb2RlUHRyIG5vZGUpIHsKKyAgICBpZiAobm9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgc3dpdGNoIChub2RlLT50eXBlKSB7CisgICAgICAgIGNhc2UgWE1MX0VMRU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfVEVYVF9OT0RFOgorICAgICAgICBjYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIGNhc2UgWE1MX0VOVElUWV9SRUZfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfRU5USVRZX05PREU6CisgICAgICAgIGNhc2UgWE1MX1BJX05PREU6CisgICAgICAgIGNhc2UgWE1MX0NPTU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfWElOQ0xVREVfU1RBUlQ6CisgICAgICAgIGNhc2UgWE1MX1hJTkNMVURFX0VORDoKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkKKyAgICAgICAgICAgIHJldHVybihub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworLyoqCisgKiB4bWxOZXh0RWxlbWVudFNpYmxpbmc6CisgKiBAbm9kZTogdGhlIGN1cnJlbnQgbm9kZQorICoKKyAqIEZpbmRzIHRoZSBmaXJzdCBjbG9zZXN0IG5leHQgc2libGluZyBvZiB0aGUgbm9kZSB3aGljaCBpcyBhbgorICogZWxlbWVudCBub2RlLgorICogTm90ZSB0aGUgaGFuZGxpbmcgb2YgZW50aXRpZXMgcmVmZXJlbmNlcyBpcyBkaWZmZXJlbnQgdGhhbiBpbgorICogdGhlIFczQyBET00gZWxlbWVudCB0cmF2ZXJzYWwgc3BlYyBzaW5jZSB3ZSBkb24ndCBoYXZlIGJhY2sgcmVmZXJlbmNlCisgKiBmcm9tIGVudGl0aWVzIGNvbnRlbnQgdG8gZW50aXRpZXMgcmVmZXJlbmNlcy4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgc2libGluZyBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKyAqLworeG1sTm9kZVB0cgoreG1sTmV4dEVsZW1lbnRTaWJsaW5nKHhtbE5vZGVQdHIgbm9kZSkgeworICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgorICAgICAgICBjYXNlIFhNTF9URVhUX05PREU6CisgICAgICAgIGNhc2UgWE1MX0NEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAgICAgY2FzZSBYTUxfRU5USVRZX1JFRl9OT0RFOgorICAgICAgICBjYXNlIFhNTF9FTlRJVFlfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfUElfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfQ09NTUVOVF9OT0RFOgorICAgICAgICBjYXNlIFhNTF9EVERfTk9ERToKKyAgICAgICAgY2FzZSBYTUxfWElOQ0xVREVfU1RBUlQ6CisgICAgICAgIGNhc2UgWE1MX1hJTkNMVURFX0VORDoKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkKKyAgICAgICAgICAgIHJldHVybihub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworI2VuZGlmIC8qIExJQlhNTF9UUkVFX0VOQUJMRUQgKi8KKwogLyoqCiAgKiB4bWxGcmVlTm9kZUxpc3Q6CiAgKiBAY3VyOiAgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIGxpc3QKQEAgLTM0NTAsNiArMzY2OCwxMSBAQAogCiAgICAgaWYgKGN1ci0+ZG9jICE9IE5VTEwpIGRpY3QgPSBjdXItPmRvYy0+ZGljdDsKIAorICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0VOVElUWV9ERUNMKSB7CisgICAgICAgIHhtbEVudGl0eVB0ciBlbnQgPSAoeG1sRW50aXR5UHRyKSBjdXI7CisJRElDVF9GUkVFKGVudC0+U3lzdGVtSUQpOworCURJQ1RfRlJFRShlbnQtPkV4dGVybmFsSUQpOworICAgIH0KICAgICBpZiAoKGN1ci0+Y2hpbGRyZW4gIT0gTlVMTCkgJiYKIAkoY3VyLT50eXBlICE9IFhNTF9FTlRJVFlfUkVGX05PREUpKQogCXhtbEZyZWVOb2RlTGlzdChjdXItPmNoaWxkcmVuKTsKQEAgLTM1MTAsNiArMzczMywyOCBAQAogCQlkb2MtPmV4dFN1YnNldCA9IE5VTEw7CiAJfQogICAgIH0KKyAgICBpZiAoY3VyLT50eXBlID09IFhNTF9FTlRJVFlfREVDTCkgeworICAgICAgICB4bWxEb2NQdHIgZG9jOworCWRvYyA9IGN1ci0+ZG9jOworCWlmIChkb2MgIT0gTlVMTCkgeworCSAgICBpZiAoZG9jLT5pbnRTdWJzZXQgIT0gTlVMTCkgeworCSAgICAgICAgaWYgKHhtbEhhc2hMb29rdXAoZG9jLT5pbnRTdWJzZXQtPmVudGl0aWVzLCBjdXItPm5hbWUpID09IGN1cikKKwkJICAgIHhtbEhhc2hSZW1vdmVFbnRyeShkb2MtPmludFN1YnNldC0+ZW50aXRpZXMsIGN1ci0+bmFtZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkgICAgICAgIGlmICh4bWxIYXNoTG9va3VwKGRvYy0+aW50U3Vic2V0LT5wZW50aXRpZXMsIGN1ci0+bmFtZSkgPT0gY3VyKQorCQkgICAgeG1sSGFzaFJlbW92ZUVudHJ5KGRvYy0+aW50U3Vic2V0LT5wZW50aXRpZXMsIGN1ci0+bmFtZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkgICAgfQorCSAgICBpZiAoZG9jLT5leHRTdWJzZXQgIT0gTlVMTCkgeworCSAgICAgICAgaWYgKHhtbEhhc2hMb29rdXAoZG9jLT5leHRTdWJzZXQtPmVudGl0aWVzLCBjdXItPm5hbWUpID09IGN1cikKKwkJICAgIHhtbEhhc2hSZW1vdmVFbnRyeShkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXMsIGN1ci0+bmFtZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkgICAgICAgIGlmICh4bWxIYXNoTG9va3VwKGRvYy0+ZXh0U3Vic2V0LT5wZW50aXRpZXMsIGN1ci0+bmFtZSkgPT0gY3VyKQorCQkgICAgeG1sSGFzaFJlbW92ZUVudHJ5KGRvYy0+ZXh0U3Vic2V0LT5wZW50aXRpZXMsIGN1ci0+bmFtZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkgICAgfQorCX0KKyAgICB9CiAgICAgaWYgKGN1ci0+cGFyZW50ICE9IE5VTEwpIHsKIAl4bWxOb2RlUHRyIHBhcmVudDsKIAlwYXJlbnQgPSBjdXItPnBhcmVudDsKQEAgLTM2MDUsNyArMzg1MCw3IEBACiAgKgkJQ29weSBvcGVyYXRpb25zCQkJCQkJKgogICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAorCiAvKioKICAqIHhtbENvcHlOYW1lc3BhY2U6CiAgKiBAY3VyOiAgdGhlIG5hbWVzcGFjZQpAQCAtMzcyMiw3ICszOTY3LDcgQEAKICAgICAgICAgICByZXQtPm5zID0geG1sTmV3UmVjb25jaWxpZWROcyh0YXJnZXQtPmRvYywgdGFyZ2V0LCBjdXItPm5zKTsKICAgICAgICAgfQogICAgICAgfQotIAorCiAgICAgfSBlbHNlCiAgICAgICAgIHJldC0+bnMgPSBOVUxMOwogCkBAIC0zODQzLDcgKzQwODgsNyBAQAogCQlyZXR1cm4oKHhtbE5vZGVQdHIpIHhtbENvcHlQcm9wSW50ZXJuYWwoZG9jLCBwYXJlbnQsICh4bWxBdHRyUHRyKSBub2RlKSk7CiAgICAgICAgIGNhc2UgWE1MX05BTUVTUEFDRV9ERUNMOgogCSAgICByZXR1cm4oKHhtbE5vZGVQdHIpIHhtbENvcHlOYW1lc3BhY2VMaXN0KCh4bWxOc1B0cikgbm9kZSkpOwotCSAgICAKKwogICAgICAgICBjYXNlIFhNTF9ET0NVTUVOVF9OT0RFOgogICAgICAgICBjYXNlIFhNTF9IVE1MX0RPQ1VNRU5UX05PREU6CiAjaWZkZWYgTElCWE1MX0RPQ0JfRU5BQkxFRApAQCAtMzg3Myw3ICs0MTE4LDcgQEAKICAgICByZXQtPnR5cGUgPSBub2RlLT50eXBlOwogCiAgICAgcmV0LT5kb2MgPSBkb2M7Ci0gICAgcmV0LT5wYXJlbnQgPSBwYXJlbnQ7IAorICAgIHJldC0+cGFyZW50ID0gcGFyZW50OwogICAgIGlmIChub2RlLT5uYW1lID09IHhtbFN0cmluZ1RleHQpCiAJcmV0LT5uYW1lID0geG1sU3RyaW5nVGV4dDsKICAgICBlbHNlIGlmIChub2RlLT5uYW1lID09IHhtbFN0cmluZ1RleHROb2VuYykKQEAgLTM5MTIsNyArNDE1Nyw3IEBACiAJaWYgKHRtcCAhPSByZXQpCiAJICAgIHJldHVybih0bXApOwogICAgIH0KLSAgICAKKwogICAgIGlmICghZXh0ZW5kZWQpCiAJZ290byBvdXQ7CiAgICAgaWYgKChub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmIChub2RlLT5uc0RlZiAhPSBOVUxMKSkKQEAgLTQxMDgsNyArNDM1Myw3IEBACiAgICAgaWYgKGR0ZC0+cGVudGl0aWVzICE9IE5VTEwpCiAJcmV0LT5wZW50aXRpZXMgPSAodm9pZCAqKSB4bWxDb3B5RW50aXRpZXNUYWJsZSgKIAkJCSAgICAoeG1sRW50aXRpZXNUYWJsZVB0cikgZHRkLT5wZW50aXRpZXMpOwotICAgIAorCiAgICAgY3VyID0gZHRkLT5jaGlsZHJlbjsKICAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKIAlxID0gTlVMTDsKQEAgLTQxMjMsNyArNDM2OCw3IEBACiAJCSAgICBicmVhazsKIAkJY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKIAkJY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKLSAgICAJCSAgICBxID0gKHhtbE5vZGVQdHIpIAorCQkgICAgcSA9ICh4bWxOb2RlUHRyKQogCQkJeG1sR2V0UGFyYW1ldGVyRW50aXR5RnJvbUR0ZChyZXQsIHRtcC0+bmFtZSk7CiAJCSAgICBicmVhazsKIAkJY2FzZSBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFk6CkBAIC00MTM1LDI3ICs0MzgwLDI3IEBACiAJCXhtbEdldER0ZFFFbGVtZW50RGVzYyhyZXQsIHRtcC0+bmFtZSwgdG1wLT5wcmVmaXgpOwogCX0gZWxzZSBpZiAoY3VyLT50eXBlID09IFhNTF9BVFRSSUJVVEVfREVDTCkgewogCSAgICB4bWxBdHRyaWJ1dGVQdHIgdG1wID0gKHhtbEF0dHJpYnV0ZVB0cikgY3VyOwotCSAgICBxID0gKHhtbE5vZGVQdHIpIAorCSAgICBxID0gKHhtbE5vZGVQdHIpCiAJCXhtbEdldER0ZFFBdHRyRGVzYyhyZXQsIHRtcC0+ZWxlbSwgdG1wLT5uYW1lLCB0bXAtPnByZWZpeCk7CiAJfSBlbHNlIGlmIChjdXItPnR5cGUgPT0gWE1MX0NPTU1FTlRfTk9ERSkgewogCSAgICBxID0geG1sQ29weU5vZGUoY3VyLCAwKTsKIAl9Ci0JCisKIAlpZiAocSA9PSBOVUxMKSB7CiAJICAgIGN1ciA9IGN1ci0+bmV4dDsKIAkgICAgY29udGludWU7CiAJfQotCQorCiAJaWYgKHAgPT0gTlVMTCkKIAkgICAgcmV0LT5jaGlsZHJlbiA9IHE7CiAJZWxzZQotICAgIAkgICAgcC0+bmV4dCA9IHE7Ci0JCi0gICAgCXEtPnByZXYgPSBwOwotICAgIAlxLT5wYXJlbnQgPSAoeG1sTm9kZVB0cikgcmV0OworCSAgICBwLT5uZXh0ID0gcTsKKworCXEtPnByZXYgPSBwOworCXEtPnBhcmVudCA9ICh4bWxOb2RlUHRyKSByZXQ7CiAJcS0+bmV4dCA9IE5VTEw7CiAJcmV0LT5sYXN0ID0gcTsKLSAgICAJcCA9IHE7CisJcCA9IHE7CiAJY3VyID0gY3VyLT5uZXh0OwogICAgIH0KIApAQCAtNDIwNSw3ICs0NDUwLDcgQEAKICAgICAgICAgcmV0LT5vbGROcyA9IHhtbENvcHlOYW1lc3BhY2VMaXN0KGRvYy0+b2xkTnMpOwogICAgIGlmIChkb2MtPmNoaWxkcmVuICE9IE5VTEwpIHsKIAl4bWxOb2RlUHRyIHRtcDsKLQkKKwogCXJldC0+Y2hpbGRyZW4gPSB4bWxTdGF0aWNDb3B5Tm9kZUxpc3QoZG9jLT5jaGlsZHJlbiwgcmV0LAogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhtbE5vZGVQdHIpcmV0KTsKIAlyZXQtPmxhc3QgPSBOVUxMOwpAQCAtNDIyNSw3ICs0NDcwLDcgQEAKICAqCQlDb250ZW50IGFjY2VzcyBmdW5jdGlvbnMJCQkJKgogICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAorCiAvKioKICAqIHhtbEdldExpbmVObzoKICAqIEBub2RlOiB2YWxpZCBub2RlCkBAIC00MzE3LDcgKzQ1NjIsNyBAQAogICAgICAgICAgICAgaWYgKGN1ci0+bnMpIHsKIAkJaWYgKGN1ci0+bnMtPnByZWZpeCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKG5hbWV0ZW1wLCBzaXplb2YobmFtZXRlbXApIC0gMSwgIiVzOiVzIiwKLQkJICAgIAkoY2hhciAqKWN1ci0+bnMtPnByZWZpeCwgKGNoYXIgKiljdXItPm5hbWUpOworCQkJKGNoYXIgKiljdXItPm5zLT5wcmVmaXgsIChjaGFyICopY3VyLT5uYW1lKTsKIAkJICAgIG5hbWV0ZW1wW3NpemVvZihuYW1ldGVtcCkgLSAxXSA9IDA7CiAJCSAgICBuYW1lID0gbmFtZXRlbXA7CiAJCX0gZWxzZSB7CkBAIC00MzI3LDcgKzQ1NzIsNyBAQAogCQkgICAgKi8KIAkJICAgIGdlbmVyaWMgPSAxOwogCQkgICAgbmFtZSA9ICIqIjsKLQkJfSAgICAgICAgICAgICAgICAKKwkJfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dCA9IGN1ci0+cGFyZW50OwogCkBAIC00NDE1LDcgKzQ2NjAsNyBAQAogCQkgICAgewogCQkJb2NjdXIgPSAxOwogCQkJYnJlYWs7Ci0JCSAgICB9CQkJCisJCSAgICB9CiAJCSAgICB0bXAgPSB0bXAtPm5leHQ7CiAJCX0KICAgICAgICAgICAgIH0gZWxzZQpAQCAtNDQ1OCwxMCArNDcwMywxMCBAQAogICAgICAgICAgICAgaWYgKGN1ci0+bnMpIHsKIAkgICAgICAgIGlmIChjdXItPm5zLT5wcmVmaXggIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgc25wcmludGYobmFtZXRlbXAsIHNpemVvZihuYW1ldGVtcCkgLSAxLCAiJXM6JXMiLAotCQkgICAgCShjaGFyICopY3VyLT5ucy0+cHJlZml4LCAoY2hhciAqKWN1ci0+bmFtZSk7CisJCQkoY2hhciAqKWN1ci0+bnMtPnByZWZpeCwgKGNoYXIgKiljdXItPm5hbWUpOwogCQllbHNlCiAJCSAgICBzbnByaW50ZihuYW1ldGVtcCwgc2l6ZW9mKG5hbWV0ZW1wKSAtIDEsICIlcyIsCi0JCSAgICAJKGNoYXIgKiljdXItPm5hbWUpOworCQkJKGNoYXIgKiljdXItPm5hbWUpOwogICAgICAgICAgICAgICAgIG5hbWV0ZW1wW3NpemVvZihuYW1ldGVtcCkgLSAxXSA9IDA7CiAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWV0ZW1wOwogICAgICAgICAgICAgfQpAQCAtNDUyOSw3ICs0Nzc0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuKHJldCk7CiB9Ci0gCisKICNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogLyoqCiAgKiB4bWxEb2NTZXRSb290RWxlbWVudDoKQEAgLTQ1NzEsNyArNDgxNiw3IEBACiAgICAgcmV0dXJuKG9sZCk7CiB9CiAjZW5kaWYKLSAKKwogI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKIC8qKgogICogeG1sTm9kZVNldExhbmc6CkBAIC00NjE5LDcgKzQ4NjQsNyBAQAogICAgIHhtbFNldE5zUHJvcChjdXIsIG5zLCBCQURfQ0FTVCAibGFuZyIsIGxhbmcpOwogfQogI2VuZGlmIC8qIExJQlhNTF9UUkVFX0VOQUJMRUQgKi8KLSAKKwogLyoqCiAgKiB4bWxOb2RlR2V0TGFuZzoKICAqIEBjdXI6ICB0aGUgbm9kZSBiZWluZyBjaGVja2VkCkBAIC00NjQyLDcgKzQ4ODcsNyBAQAogICAgIH0KICAgICByZXR1cm4oTlVMTCk7CiB9Ci0gCisKIAogI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKIC8qKgpAQCAtNDczMCw3ICs0OTc1LDcgQEAKICAgICB9CiAgICAgcmV0dXJuKC0xKTsKIH0KLSAKKwogI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKIC8qKgogICogeG1sTm9kZVNldE5hbWU6CkBAIC00Nzg4LDcgKzUwMzMsNyBAQAogICAgIH0KIH0KICNlbmRpZgotIAorCiAjaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQogLyoqCiAgKiB4bWxOb2RlU2V0QmFzZToKQEAgLTQ4NDEsNyArNTA4Niw3IEBACiAJICAgIHJldHVybjsKIAl9CiAgICAgfQotICAgIAorCiAgICAgbnMgPSB4bWxTZWFyY2hOc0J5SHJlZihjdXItPmRvYywgY3VyLCBYTUxfWE1MX05BTUVTUEFDRSk7CiAgICAgaWYgKG5zID09IE5VTEwpCiAJcmV0dXJuOwpAQCAtNDg3Nyw5ICs1MTIyLDkgQEAKICAgICB4bWxDaGFyICpvbGRiYXNlID0gTlVMTDsKICAgICB4bWxDaGFyICpiYXNlLCAqbmV3YmFzZTsKIAotICAgIGlmICgoY3VyID09IE5VTEwpICYmIChkb2MgPT0gTlVMTCkpIAorICAgIGlmICgoY3VyID09IE5VTEwpICYmIChkb2MgPT0gTlVMTCkpCiAgICAgICAgIHJldHVybihOVUxMKTsKLSAgICBpZiAoZG9jID09IE5VTEwpIGRvYyA9IGN1ci0+ZG9jOwkKKyAgICBpZiAoZG9jID09IE5VTEwpIGRvYyA9IGN1ci0+ZG9jOwogICAgIGlmICgoZG9jICE9IE5VTEwpICYmIChkb2MtPnR5cGUgPT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSkpIHsKICAgICAgICAgY3VyID0gZG9jLT5jaGlsZHJlbjsKIAl3aGlsZSAoKGN1ciAhPSBOVUxMKSAmJiAoY3VyLT5uYW1lICE9IE5VTEwpKSB7CkBAIC00OTQxLDcgKzUxODYsNyBAQAogICAgIH0KICAgICByZXR1cm4ob2xkYmFzZSk7CiB9Ci0gCisKIC8qKgogICogeG1sTm9kZUJ1ZkdldENvbnRlbnQ6CiAgKiBAYnVmZmVyOiAgYSBidWZmZXIKQEAgLTQ5NTIsNyArNTE5Nyw3IEBACiAgKiBvZiB0aGUgdmFsdWVzIGNhcnJpZWQgYnkgdGhpcyBub2RlIGNoaWxkJ3MgKFRFWFQgYW5kIEVOVElUWV9SRUYpLgogICogRW50aXR5IHJlZmVyZW5jZXMgYXJlIHN1YnN0aXR1dGVkLgogICogRmlsbHMgdXAgdGhlIGJ1ZmZlciBAYnVmZmVyIHdpdGggdGhpcyB2YWx1ZQotICogCisgKgogICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgLTEgaW4gY2FzZSBvZiBlcnJvci4KICAqLwogaW50CkBAIC01MjMxLDEyICs1NDc2LDEyIEBACiAJICAgICAgICBpZiAoISgoY3VyLT5kb2MgIT0gTlVMTCkgJiYgKGN1ci0+ZG9jLT5kaWN0ICE9IE5VTEwpICYmCiAJCSAgICAoeG1sRGljdE93bnMoY3VyLT5kb2MtPmRpY3QsIGN1ci0+Y29udGVudCkpKSkKIAkJICAgIHhtbEZyZWUoY3VyLT5jb250ZW50KTsKLQkgICAgfQkKKwkgICAgfQogCSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB4bWxGcmVlTm9kZUxpc3QoY3VyLT5jaGlsZHJlbik7CiAJICAgIGN1ci0+bGFzdCA9IGN1ci0+Y2hpbGRyZW4gPSBOVUxMOwogCSAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAJCWN1ci0+Y29udGVudCA9IHhtbFN0cmR1cChjb250ZW50KTsKLQkgICAgfSBlbHNlIAorCSAgICB9IGVsc2UKIAkJY3VyLT5jb250ZW50ID0gTlVMTDsKIAkgICAgY3VyLT5wcm9wZXJ0aWVzID0gTlVMTDsKIAkgICAgY3VyLT5uc0RlZiA9IE5VTEw7CkBAIC01MzA5LDEyICs1NTU0LDEyIEBACiAJICAgICAgICBpZiAoISgoY3VyLT5kb2MgIT0gTlVMTCkgJiYgKGN1ci0+ZG9jLT5kaWN0ICE9IE5VTEwpICYmCiAJCSAgICAoeG1sRGljdE93bnMoY3VyLT5kb2MtPmRpY3QsIGN1ci0+Y29udGVudCkpKSkKIAkJICAgIHhtbEZyZWUoY3VyLT5jb250ZW50KTsKLQkgICAgfQkKKwkgICAgfQogCSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB4bWxGcmVlTm9kZUxpc3QoY3VyLT5jaGlsZHJlbik7CiAJICAgIGN1ci0+Y2hpbGRyZW4gPSBjdXItPmxhc3QgPSBOVUxMOwogCSAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAJCWN1ci0+Y29udGVudCA9IHhtbFN0cm5kdXAoY29udGVudCwgbGVuKTsKLQkgICAgfSBlbHNlIAorCSAgICB9IGVsc2UKIAkJY3VyLT5jb250ZW50ID0gTlVMTDsKIAkgICAgY3VyLT5wcm9wZXJ0aWVzID0gTlVMTDsKIAkgICAgY3VyLT5uc0RlZiA9IE5VTEw7CkBAIC01MzQ4LDcgKzU1OTMsNyBAQAogICogQGN1cjogIHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkCiAgKiBAY29udGVudDogIGV4dHJhIGNvbnRlbnQKICAqIEBsZW46ICB0aGUgc2l6ZSBvZiBAY29udGVudAotICogCisgKgogICogQXBwZW5kIHRoZSBleHRyYSBzdWJzdHJpbmcgdG8gdGhlIG5vZGUgY29udGVudC4KICAqIE5PVEU6IEluIGNvbnRyYXN0IHRvIHhtbE5vZGVTZXRDb250ZW50TGVuKCksIEBjb250ZW50IGlzIHN1cHBvc2VkIHRvIGJlCiAgKiAgICAgICByYXcgdGV4dCwgc28gdW5lc2NhcGVkIFhNTCBzcGVjaWFsIGNoYXJzIGFyZSBhbGxvd2VkLCBlbnRpdHkKQEAgLTU0MjMsNyArNTY2OCw3IEBACiAgKiB4bWxOb2RlQWRkQ29udGVudDoKICAqIEBjdXI6ICB0aGUgbm9kZSBiZWluZyBtb2RpZmllZAogICogQGNvbnRlbnQ6ICBleHRyYSBjb250ZW50Ci0gKiAKKyAqCiAgKiBBcHBlbmQgdGhlIGV4dHJhIHN1YnN0cmluZyB0byB0aGUgbm9kZSBjb250ZW50LgogICogTk9URTogSW4gY29udHJhc3QgdG8geG1sTm9kZVNldENvbnRlbnQoKSwgQGNvbnRlbnQgaXMgc3VwcG9zZWQgdG8gYmUKICAqICAgICAgIHJhdyB0ZXh0LCBzbyB1bmVzY2FwZWQgWE1MIHNwZWNpYWwgY2hhcnMgYXJlIGFsbG93ZWQsIGVudGl0eQpAQCAtNTQ0OSw3ICs1Njk0LDcgQEAKICAqIHhtbFRleHRNZXJnZToKICAqIEBmaXJzdDogIHRoZSBmaXJzdCB0ZXh0IG5vZGUKICAqIEBzZWNvbmQ6ICB0aGUgc2Vjb25kIHRleHQgbm9kZSBiZWluZyBtZXJnZWQKLSAqIAorICoKICAqIE1lcmdlIHR3byB0ZXh0IG5vZGVzIGludG8gb25lCiAgKiBSZXR1cm5zIHRoZSBmaXJzdCB0ZXh0IG5vZGUgYXVnbWVudGVkCiAgKi8KQEAgLTU1MzQsOSArNTc3OSw5IEBACiAvKgogKiB4bWxUcmVlRW5zdXJlWE1MRGVjbDoKICogQGRvYzogdGhlIGRvYwotKiAKKyoKICogRW5zdXJlcyB0aGF0IHRoZXJlIGlzIGFuIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gb24gdGhlIGRvYy4KLSogCisqCiAqIFJldHVybnMgdGhlIFhNTCBucy1zdHJ1Y3Qgb3IgTlVMTCBvbiBBUEkgYW5kIGludGVybmFsIGVycm9ycy4KICovCiBzdGF0aWMgeG1sTnNQdHIKQEAgLTU1NTYsNyArNTgwMSw3IEBACiAJfQogCW1lbXNldChucywgMCwgc2l6ZW9mKHhtbE5zKSk7CiAJbnMtPnR5cGUgPSBYTUxfTE9DQUxfTkFNRVNQQUNFOwotCW5zLT5ocmVmID0geG1sU3RyZHVwKFhNTF9YTUxfTkFNRVNQQUNFKTsgCisJbnMtPmhyZWYgPSB4bWxTdHJkdXAoWE1MX1hNTF9OQU1FU1BBQ0UpOwogCW5zLT5wcmVmaXggPSB4bWxTdHJkdXAoKGNvbnN0IHhtbENoYXIgKikieG1sIik7CiAJZG9jLT5vbGROcyA9IG5zOwogCXJldHVybiAobnMpOwpAQCAtNTU4MSw3ICs1ODI2LDcgQEAKICAqLwogeG1sTnNQdHIKIHhtbFNlYXJjaE5zKHhtbERvY1B0ciBkb2MsIHhtbE5vZGVQdHIgbm9kZSwgY29uc3QgeG1sQ2hhciAqbmFtZVNwYWNlKSB7Ci0JCisKICAgICB4bWxOc1B0ciBjdXI7CiAgICAgeG1sTm9kZVB0ciBvcmlnID0gbm9kZTsKIApAQCAtNTYwMSw4ICs1ODQ2LDggQEAKIAkgICAgfQogCSAgICBtZW1zZXQoY3VyLCAwLCBzaXplb2YoeG1sTnMpKTsKIAkgICAgY3VyLT50eXBlID0gWE1MX0xPQ0FMX05BTUVTUEFDRTsKLQkgICAgY3VyLT5ocmVmID0geG1sU3RyZHVwKFhNTF9YTUxfTkFNRVNQQUNFKTsgCi0JICAgIGN1ci0+cHJlZml4ID0geG1sU3RyZHVwKChjb25zdCB4bWxDaGFyICopInhtbCIpOyAKKwkgICAgY3VyLT5ocmVmID0geG1sU3RyZHVwKFhNTF9YTUxfTkFNRVNQQUNFKTsKKwkgICAgY3VyLT5wcmVmaXggPSB4bWxTdHJkdXAoKGNvbnN0IHhtbENoYXIgKikieG1sIik7CiAJICAgIGN1ci0+bmV4dCA9IG5vZGUtPm5zRGVmOwogCSAgICBub2RlLT5uc0RlZiA9IGN1cjsKIAkgICAgcmV0dXJuKGN1cik7CkBAIC01NjM3LDcgKzU4ODIsNyBAQAogCQkgICAgcmV0dXJuKGN1cik7CiAJCWN1ciA9IGN1ci0+bmV4dDsKIAkgICAgfQotCSAgICBpZiAob3JpZyAhPSBub2RlKSB7IAorCSAgICBpZiAob3JpZyAhPSBub2RlKSB7CiAJICAgICAgICBjdXIgPSBub2RlLT5uczsKIAkgICAgICAgIGlmIChjdXIgIT0gTlVMTCkgewogCQkgICAgaWYgKChjdXItPnByZWZpeCA9PSBOVUxMKSAmJiAobmFtZVNwYWNlID09IE5VTEwpICYmCkBAIC01NjQ4LDcgKzU4OTMsNyBAQAogCQkgICAgICAgICh4bWxTdHJFcXVhbChjdXItPnByZWZpeCwgbmFtZVNwYWNlKSkpCiAJCSAgICAgICAgcmV0dXJuKGN1cik7CiAJICAgICAgICB9Ci0JICAgIH0gICAgCisJICAgIH0KIAl9CiAJbm9kZSA9IG5vZGUtPnBhcmVudDsKICAgICB9CkBAIC01NjY0LDcgKzU5MDksNyBAQAogICoKICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBuYW1lc3BhY2UgaGVsZCBvbiBAYW5jZXN0b3IgaXMgc3RpbGwgaW4gc2NvcGUKICAqIG9uIG5vZGUuCi0gKiAKKyAqCiAgKiBSZXR1cm5zIDEgaWYgdHJ1ZSwgMCBpZiBmYWxzZSBhbmQgLTEgaW4gY2FzZSBvZiBlcnJvci4KICAqLwogc3RhdGljIGludApAQCAtNTY5Nyw3ICs1OTQyLDcgQEAKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgcmV0dXJuICgxKTsKIH0KLSAgICAgICAgICAgICAgICAgIAorCiAvKioKICAqIHhtbFNlYXJjaE5zQnlIcmVmOgogICogQGRvYzogIHRoZSBkb2N1bWVudApAQCAtNTc1MSw3ICs1OTk2LDcgQEAKIAlpZiAoZG9jLT5vbGROcyA9PSBOVUxMKQogCSAgICByZXR1cm4oeG1sVHJlZUVuc3VyZVhNTERlY2woZG9jKSk7CiAJZWxzZQotCSAgICByZXR1cm4oZG9jLT5vbGROcyk7ICAgICAgICAKKwkgICAgcmV0dXJuKGRvYy0+b2xkTnMpOwogICAgIH0KICAgICBpc19hdHRyID0gKG5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKTsKICAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7CkBAIC01NzgwLDcgKzYwMjUsNyBAQAogCQkJICAgIHJldHVybiAoY3VyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKICAgICB9CkBAIC01ODQzLDcgKzYwODgsNyBAQAogCSAgICBzbnByaW50ZigoY2hhciAqKSBwcmVmaXgsIHNpemVvZihwcmVmaXgpLCAiZGVmYXVsdCVkIiwgY291bnRlcisrKTsKIAllbHNlCiAJICAgIHNucHJpbnRmKChjaGFyICopIHByZWZpeCwgc2l6ZW9mKHByZWZpeCksICIlLjIwcyVkIiwKLQkgICAgCShjaGFyICopbnMtPnByZWZpeCwgY291bnRlcisrKTsKKwkJKGNoYXIgKilucy0+cHJlZml4LCBjb3VudGVyKyspOwogCWRlZiA9IHhtbFNlYXJjaE5zKGRvYywgdHJlZSwgcHJlZml4KTsKICAgICB9CiAKQEAgLTYwMzgsNyArNjI4Myw3IEBACiAJCX0KIAkgICAgfQogCSAgICAvKiBleGl0IGNvbmRpdGlvbiAqLwotCSAgICBpZiAobm9kZSA9PSB0cmVlKSAKKwkgICAgaWYgKG5vZGUgPT0gdHJlZSkKIAkgICAgICAgIG5vZGUgPSBOVUxMOwogCX0gZWxzZQogCSAgICBicmVhazsKQEAgLTYwOTQsMTQgKzYzMzksMTQgQEAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZXJlIGlzIGEgZGVmYXVsdC9maXhlZCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gaW4KICAgICAgKiB0aGUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgc3Vic2V0LgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBpZiAoKG5vZGUtPmRvYyAhPSBOVUxMKSAmJiAobm9kZS0+ZG9jLT5pbnRTdWJzZXQgIT0gTlVMTCkpIHsKIAl4bWxEb2NQdHIgZG9jID0gbm9kZS0+ZG9jOwogCXhtbEF0dHJpYnV0ZVB0ciBhdHRyRGVjbCA9IE5VTEw7CiAJeG1sQ2hhciAqZWxlbVFOYW1lLCAqdG1wc3RyID0gTlVMTDsKIAogCS8qCi0JKiBXZSBuZWVkIHRoZSBRTmFtZSBvZiB0aGUgZWxlbWVudCBmb3IgdGhlIERURC1sb29rdXAuCQorCSogV2UgbmVlZCB0aGUgUU5hbWUgb2YgdGhlIGVsZW1lbnQgZm9yIHRoZSBEVEQtbG9va3VwLgogCSovCiAJaWYgKChub2RlLT5ucyAhPSBOVUxMKSAmJiAobm9kZS0+bnMtPnByZWZpeCAhPSBOVUxMKSkgewogCSAgICB0bXBzdHIgPSB4bWxTdHJkdXAobm9kZS0+bnMtPnByZWZpeCk7CkBAIC02MTUyLDcgKzYzOTcsNyBAQAogCQljdXIrKzsKIAkgICAgfQogCSAgICB4bWxGcmVlKG5zTGlzdCk7Ci0JfQkKKwl9CiAJaWYgKHRtcHN0ciAhPSBOVUxMKQogCSAgICB4bWxGcmVlKHRtcHN0cik7CiAJLyoKQEAgLTYxOTYsNyArNjQ0MSw3IEBACiAgICAgfSBlbHNlIGlmIChwcm9wLT50eXBlID09IFhNTF9BVFRSSUJVVEVfREVDTCkgewogCXJldHVybih4bWxTdHJkdXAoKCh4bWxBdHRyaWJ1dGVQdHIpcHJvcCktPmRlZmF1bHRWYWx1ZSkpOwogICAgIH0KLSAgICByZXR1cm4oTlVMTCk7IAorICAgIHJldHVybihOVUxMKTsKIH0KIAogLyoqCkBAIC02MjA4LDcgKzY0NTMsNyBAQAogICogVGhpcyBmdW5jdGlvbiBhbHNvIGxvb2tzIGluIERURCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yICNGSVhFRCBvcgogICogZGVmYXVsdCBkZWNsYXJhdGlvbiB2YWx1ZXMgdW5sZXNzIERURCB1c2UgaGFzIGJlZW4gdHVybmVkIG9mZi4KICAqCi0gKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgb3IgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBvciBOVUxMIGlmIAorICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG9yIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gb3IgTlVMTCBpZgogICogICAgICAgICBuZWl0aGVyIHdhcyBmb3VuZC4KICAqLwogeG1sQXR0clB0cgpAQCAtNjI5MCwxMiArNjUzNSwxMiBAQAogICovCiB4bWxDaGFyICoKIHhtbEdldFByb3AoeG1sTm9kZVB0ciBub2RlLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7Ci0gICAgeG1sQXR0clB0ciBwcm9wOyAgICAKKyAgICB4bWxBdHRyUHRyIHByb3A7CiAKICAgICBwcm9wID0geG1sSGFzUHJvcChub2RlLCBuYW1lKTsKICAgICBpZiAocHJvcCA9PSBOVUxMKQogCXJldHVybihOVUxMKTsKLSAgICByZXR1cm4oeG1sR2V0UHJvcE5vZGVWYWx1ZUludGVybmFsKHByb3ApKTsgICAgIAorICAgIHJldHVybih4bWxHZXRQcm9wTm9kZVZhbHVlSW50ZXJuYWwocHJvcCkpOwogfQogCiAvKioKQEAgLTYzMTYsNyArNjU2MSw3IEBACiB4bWxDaGFyICoKIHhtbEdldE5vTnNQcm9wKHhtbE5vZGVQdHIgbm9kZSwgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgIHhtbEF0dHJQdHIgcHJvcDsKLSAgICAKKwogICAgIHByb3AgPSB4bWxHZXRQcm9wTm9kZUludGVybmFsKG5vZGUsIG5hbWUsIE5VTEwsIHhtbENoZWNrRFREKTsKICAgICBpZiAocHJvcCA9PSBOVUxMKQogCXJldHVybihOVUxMKTsKQEAgLTYzODIsNyArNjYyNyw3IEBACiBpbnQKIHhtbFVuc2V0TnNQcm9wKHhtbE5vZGVQdHIgbm9kZSwgeG1sTnNQdHIgbnMsIGNvbnN0IHhtbENoYXIgKm5hbWUpIHsKICAgICB4bWxBdHRyUHRyIHByb3A7Ci0gICAgCisKICAgICBwcm9wID0geG1sR2V0UHJvcE5vZGVJbnRlcm5hbChub2RlLCBuYW1lLCAobnMgIT0gTlVMTCkgPyBucy0+aHJlZiA6IE5VTEwsIDApOwogICAgIGlmIChwcm9wID09IE5VTEwpCiAJcmV0dXJuKC0xKTsKQEAgLTY0MDUsNyArNjY1MCw3IEBACiAgKiBlcnJvciBpdCB0aGVyZSdzIG5vIHN1Y2ggbnMtYmluZGluZyBmb3IgdGhlIHByZWZpeCBpbgogICogc2NvcGUuCiAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgcG9pbnRlci4KLSAqIAorICoKICAqLwogeG1sQXR0clB0cgogeG1sU2V0UHJvcCh4bWxOb2RlUHRyIG5vZGUsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGNvbnN0IHhtbENoYXIgKnZhbHVlKSB7CkBAIC02NDQ4LDcgKzY2OTMsNyBAQAogCSAgICAgY29uc3QgeG1sQ2hhciAqdmFsdWUpCiB7CiAgICAgeG1sQXR0clB0ciBwcm9wOwotICAgIAorCiAgICAgaWYgKG5zICYmIChucy0+aHJlZiA9PSBOVUxMKSkKIAlyZXR1cm4oTlVMTCk7CiAgICAgcHJvcCA9IHhtbEdldFByb3BOb2RlSW50ZXJuYWwobm9kZSwgbmFtZSwgKG5zICE9IE5VTEwpID8gbnMtPmhyZWYgOiBOVUxMLCAwKTsKQEAgLTY0NjAsMTcgKzY3MDUsMjEgQEAKIAkgICAgeG1sUmVtb3ZlSUQobm9kZS0+ZG9jLCBwcm9wKTsKIAkgICAgcHJvcC0+YXR5cGUgPSBYTUxfQVRUUklCVVRFX0lEOwogCX0KLQlpZiAocHJvcC0+Y2hpbGRyZW4gIT0gTlVMTCkgCisJaWYgKHByb3AtPmNoaWxkcmVuICE9IE5VTEwpCiAJICAgIHhtbEZyZWVOb2RlTGlzdChwcm9wLT5jaGlsZHJlbik7CiAJcHJvcC0+Y2hpbGRyZW4gPSBOVUxMOwogCXByb3AtPmxhc3QgPSBOVUxMOwogCXByb3AtPm5zID0gbnM7CiAJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkgICAgeG1sQ2hhciAqYnVmZmVyOwogCSAgICB4bWxOb2RlUHRyIHRtcDsKLQkgICAgCi0JICAgIGJ1ZmZlciA9IHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KG5vZGUtPmRvYywgdmFsdWUpOwotCSAgICBwcm9wLT5jaGlsZHJlbiA9IHhtbFN0cmluZ0dldE5vZGVMaXN0KG5vZGUtPmRvYywgYnVmZmVyKTsKKworCSAgICBpZigheG1sQ2hlY2tVVEY4KHZhbHVlKSkgeworCSAgICAgICAgeG1sVHJlZUVycihYTUxfVFJFRV9OT1RfVVRGOCwgKHhtbE5vZGVQdHIpIG5vZGUtPmRvYywKKwkgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUtPmRvYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBub2RlLT5kb2MtPmVuY29kaW5nID0geG1sU3RyZHVwKEJBRF9DQVNUICJJU08tODg1OS0xIik7CisJICAgIH0KKwkgICAgcHJvcC0+Y2hpbGRyZW4gPSB4bWxOZXdEb2NUZXh0KG5vZGUtPmRvYywgdmFsdWUpOwogCSAgICBwcm9wLT5sYXN0ID0gTlVMTDsKIAkgICAgdG1wID0gcHJvcC0+Y2hpbGRyZW47CiAJICAgIHdoaWxlICh0bXAgIT0gTlVMTCkgewpAQCAtNjQ3OSw3ICs2NzI4LDYgQEAKIAkJICAgIHByb3AtPmxhc3QgPSB0bXA7CiAJCXRtcCA9IHRtcC0+bmV4dDsKIAkgICAgfQotCSAgICB4bWxGcmVlKGJ1ZmZlcik7CiAJfQogCWlmIChwcm9wLT5hdHlwZSA9PSBYTUxfQVRUUklCVVRFX0lEKQogCSAgICB4bWxBZGRJRChOVUxMLCBub2RlLT5kb2MsIHZhbHVlLCBwcm9wKTsKQEAgLTY0OTYsNyArNjc0NCw3IEBACiAvKioKICAqIHhtbE5vZGVJc1RleHQ6CiAgKiBAbm9kZTogIHRoZSBub2RlCi0gKiAKKyAqCiAgKiBJcyB0aGlzIG5vZGUgYSBUZXh0IG5vZGUgPwogICogUmV0dXJucyAxIHllcywgMCBubwogICovCkBAIC02NTExLDcgKzY3NTksNyBAQAogLyoqCiAgKiB4bWxJc0JsYW5rTm9kZToKICAqIEBub2RlOiAgdGhlIG5vZGUKLSAqIAorICoKICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBhbiBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkKICAqIChhbmQgcG9zc2libHkgaWdub3JhYmxlKSB0ZXh0LW5vZGUuCiAgKgpAQCAtNjU0MCw3ICs2Nzg4LDcgQEAKICAqIEBub2RlOiAgdGhlIG5vZGUKICAqIEBjb250ZW50OiAgdGhlIGNvbnRlbnQKICAqIEBsZW46ICBAY29udGVudCBsZW5ndGgKLSAqIAorICoKICAqIENvbmNhdCB0aGUgZ2l2ZW4gc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGV4aXN0aW5nIG5vZGUgY29udGVudAogICoKICAqIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgMCBvdGhlcndpc2UKQEAgLTY2MDUsNiArNjg1Myw3IEBACiAgICAgICAgIHJldHVybihOVUxMKTsKICAgICB9CiAgICAgcmV0LT5jb250ZW50WzBdID0gMDsKKyAgICByZXQtPmNvbnRlbnRJTyA9IE5VTEw7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTY2MzcsNiArNjg4Niw3IEBACiAgICAgICAgIHJldC0+Y29udGVudFswXSA9IDA7CiAgICAgfSBlbHNlCiAJcmV0LT5jb250ZW50ID0gTlVMTDsKKyAgICByZXQtPmNvbnRlbnRJTyA9IE5VTEw7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTY2NzgsNyArNjkyOCw3IEBACiAgKiBTZXRzIHRoZSBhbGxvY2F0aW9uIHNjaGVtZSBmb3IgdGhpcyBidWZmZXIKICAqLwogdm9pZAoteG1sQnVmZmVyU2V0QWxsb2NhdGlvblNjaGVtZSh4bWxCdWZmZXJQdHIgYnVmLCAKK3htbEJ1ZmZlclNldEFsbG9jYXRpb25TY2hlbWUoeG1sQnVmZmVyUHRyIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZSBzY2hlbWUpIHsKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICNpZmRlZiBERUJVR19CVUZGRVIKQEAgLTY2ODcsOSArNjkzNywxMiBAQAogI2VuZGlmCiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKGJ1Zi0+YWxsb2MgPT0gWE1MX0JVRkZFUl9BTExPQ19JTU1VVEFCTEUpIHJldHVybjsKLQotICAgIGJ1Zi0+YWxsb2MgPSBzY2hlbWU7CisgICAgaWYgKChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFKSB8fAorICAgICAgICAoYnVmLT5hbGxvYyA9PSBYTUxfQlVGRkVSX0FMTE9DX0lPKSkgcmV0dXJuOworICAgIGlmICgoc2NoZW1lID09IFhNTF9CVUZGRVJfQUxMT0NfRE9VQkxFSVQpIHx8CisgICAgICAgIChzY2hlbWUgPT0gWE1MX0JVRkZFUl9BTExPQ19FWEFDVCkgfHwKKyAgICAgICAgKHNjaGVtZSA9PSBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSkpCisJYnVmLT5hbGxvYyA9IHNjaGVtZTsKIH0KIAogLyoqCkBAIC02NzA5LDcgKzY5NjIsMTAgQEAKIAlyZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChidWYtPmNvbnRlbnQgIT0gTlVMTCkgJiYKKyAgICBpZiAoKGJ1Zi0+YWxsb2MgPT0gWE1MX0JVRkZFUl9BTExPQ19JTykgJiYKKyAgICAgICAgKGJ1Zi0+Y29udGVudElPICE9IE5VTEwpKSB7CisgICAgICAgIHhtbEZyZWUoYnVmLT5jb250ZW50SU8pOworICAgIH0gZWxzZSBpZiAoKGJ1Zi0+Y29udGVudCAhPSBOVUxMKSAmJgogICAgICAgICAoYnVmLT5hbGxvYyAhPSBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSkpIHsKICAgICAgICAgeG1sRnJlZShidWYtPmNvbnRlbnQpOwogICAgIH0KQEAgLTY3MjksOCArNjk4NSwxNSBAQAogICAgIGJ1Zi0+dXNlID0gMDsKICAgICBpZiAoYnVmLT5hbGxvYyA9PSBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSkgewogICAgICAgICBidWYtPmNvbnRlbnQgPSBCQURfQ0FTVCAiIjsKKyAgICB9IGVsc2UgaWYgKChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU8pICYmCisgICAgICAgICAgICAgICAoYnVmLT5jb250ZW50SU8gIT0gTlVMTCkpIHsKKyAgICAgICAgc2l6ZV90IHN0YXJ0X2J1ZiA9IGJ1Zi0+Y29udGVudCAtIGJ1Zi0+Y29udGVudElPOworCisJYnVmLT5zaXplICs9IHN0YXJ0X2J1ZjsKKyAgICAgICAgYnVmLT5jb250ZW50ID0gYnVmLT5jb250ZW50SU87CisgICAgICAgIGJ1Zi0+Y29udGVudFswXSA9IDA7CiAgICAgfSBlbHNlIHsKLQltZW1zZXQoYnVmLT5jb250ZW50LCAwLCBidWYtPnNpemUpOworICAgICAgICBidWYtPmNvbnRlbnRbMF0gPSAwOwogICAgIH0KIH0KIApAQCAtNjc1MCwxMCArNzAxMywzMCBAQAogICAgIGlmIChsZW4gPiBidWYtPnVzZSkgcmV0dXJuKC0xKTsKIAogICAgIGJ1Zi0+dXNlIC09IGxlbjsKLSAgICBpZiAoYnVmLT5hbGxvYyA9PSBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSkgeworICAgIGlmICgoYnVmLT5hbGxvYyA9PSBYTUxfQlVGRkVSX0FMTE9DX0lNTVVUQUJMRSkgfHwKKyAgICAgICAgKChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU8pICYmIChidWYtPmNvbnRlbnRJTyAhPSBOVUxMKSkpIHsKKwkvKgorCSAqIHdlIGp1c3QgbW92ZSB0aGUgY29udGVudCBwb2ludGVyLCBidXQgYWxzbyBtYWtlIHN1cmUKKwkgKiB0aGUgcGVyY2VpdmVkIGJ1ZmZlciBzaXplIGhhcyBzaHJpbmtlZCBhY2NvcmRpbmdseQorCSAqLwogICAgICAgICBidWYtPmNvbnRlbnQgKz0gbGVuOworCWJ1Zi0+c2l6ZSAtPSBsZW47CisKKyAgICAgICAgLyoKKwkgKiBzb21ldGltZXMgdGhvdWdoIGl0IG1heWJlIGJlIGJldHRlciB0byByZWFsbHkgc2hyaW5rCisJICogb24gSU8gYnVmZmVycworCSAqLworCWlmICgoYnVmLT5hbGxvYyA9PSBYTUxfQlVGRkVSX0FMTE9DX0lPKSAmJiAoYnVmLT5jb250ZW50SU8gIT0gTlVMTCkpIHsKKwkgICAgc2l6ZV90IHN0YXJ0X2J1ZiA9IGJ1Zi0+Y29udGVudCAtIGJ1Zi0+Y29udGVudElPOworCSAgICBpZiAoc3RhcnRfYnVmID49IGJ1Zi0+c2l6ZSkgeworCQltZW1tb3ZlKGJ1Zi0+Y29udGVudElPLCAmYnVmLT5jb250ZW50WzBdLCBidWYtPnVzZSk7CisJCWJ1Zi0+Y29udGVudCA9IGJ1Zi0+Y29udGVudElPOworCQlidWYtPmNvbnRlbnRbYnVmLT51c2VdID0gMDsKKwkJYnVmLT5zaXplICs9IHN0YXJ0X2J1ZjsKKwkgICAgfQorCX0KICAgICB9IGVsc2UgewotCW1lbW1vdmUoYnVmLT5jb250ZW50LCAmYnVmLT5jb250ZW50W2xlbl0sIGJ1Zi0+dXNlICogc2l6ZW9mKHhtbENoYXIpKTsKKwltZW1tb3ZlKGJ1Zi0+Y29udGVudCwgJmJ1Zi0+Y29udGVudFtsZW5dLCBidWYtPnVzZSk7CiAJYnVmLT5jb250ZW50W2J1Zi0+dXNlXSA9IDA7CiAgICAgfQogICAgIHJldHVybihsZW4pOwpAQCAtNjc5MSwxMiArNzA3NCwyNCBAQAogICAgIHNpemUgPSBidWYtPnVzZSArIGxlbiArIDEwMDsKICNlbmRpZgogCi0gICAgbmV3YnVmID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhidWYtPmNvbnRlbnQsIHNpemUpOwotICAgIGlmIChuZXdidWYgPT0gTlVMTCkgewotCXhtbFRyZWVFcnJNZW1vcnkoImdyb3dpbmcgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybigtMSk7CisgICAgaWYgKChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU8pICYmIChidWYtPmNvbnRlbnRJTyAhPSBOVUxMKSkgeworICAgICAgICBzaXplX3Qgc3RhcnRfYnVmID0gYnVmLT5jb250ZW50IC0gYnVmLT5jb250ZW50SU87CisKKwluZXdidWYgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKGJ1Zi0+Y29udGVudElPLCBzdGFydF9idWYgKyBzaXplKTsKKwlpZiAobmV3YnVmID09IE5VTEwpIHsKKwkgICAgeG1sVHJlZUVyck1lbW9yeSgiZ3Jvd2luZyBidWZmZXIiKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJYnVmLT5jb250ZW50SU8gPSBuZXdidWY7CisJYnVmLT5jb250ZW50ID0gbmV3YnVmICsgc3RhcnRfYnVmOworICAgIH0gZWxzZSB7CisJbmV3YnVmID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhidWYtPmNvbnRlbnQsIHNpemUpOworCWlmIChuZXdidWYgPT0gTlVMTCkgeworCSAgICB4bWxUcmVlRXJyTWVtb3J5KCJncm93aW5nIGJ1ZmZlciIpOworCSAgICByZXR1cm4oLTEpOworCX0KKwlidWYtPmNvbnRlbnQgPSBuZXdidWY7CiAgICAgfQotICAgIGJ1Zi0+Y29udGVudCA9IG5ld2J1ZjsKICAgICBidWYtPnNpemUgPSBzaXplOwogICAgIHJldHVybihidWYtPnNpemUgLSBidWYtPnVzZSk7CiB9CkBAIC02ODUzLDcgKzcxNDgsNyBAQAogCiAvKioKICAqIHhtbEJ1ZmZlckxlbmd0aDoKLSAqIEBidWY6ICB0aGUgYnVmZmVyIAorICogQGJ1ZjogIHRoZSBidWZmZXIKICAqCiAgKiBGdW5jdGlvbiB0byBnZXQgdGhlIGxlbmd0aCBvZiBhIGJ1ZmZlcgogICoKQEAgLTY4ODMsNiArNzE3OCw3IEBACiB7CiAgICAgdW5zaWduZWQgaW50IG5ld1NpemU7CiAgICAgeG1sQ2hhciogcmVidWYgPSBOVUxMOworICAgIHNpemVfdCBzdGFydF9idWY7CiAKICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIHJldHVybigwKTsKQEAgLTY4OTUsNDIgKzcxOTEsNjggQEAKIAogICAgIC8qIGZpZ3VyZSBvdXQgbmV3IHNpemUgKi8KICAgICBzd2l0Y2ggKGJ1Zi0+YWxsb2MpewotICAgIGNhc2UgWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVDoKLQkvKnRha2UgY2FyZSBvZiBlbXB0eSBjYXNlKi8KLSAgICAgICAgbmV3U2l6ZSA9IChidWYtPnNpemUgPyBidWYtPnNpemUqMiA6IHNpemUgKyAxMCk7Ci0gICAgICAgIHdoaWxlIChzaXplID4gbmV3U2l6ZSkgbmV3U2l6ZSAqPSAyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9CVUZGRVJfQUxMT0NfRVhBQ1Q6Ci0gICAgICAgIG5ld1NpemUgPSBzaXplKzEwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBuZXdTaXplID0gc2l6ZSsxMDsKLSAgICAgICAgYnJlYWs7CisJY2FzZSBYTUxfQlVGRkVSX0FMTE9DX0lPOgorCWNhc2UgWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVDoKKwkgICAgLyp0YWtlIGNhcmUgb2YgZW1wdHkgY2FzZSovCisJICAgIG5ld1NpemUgPSAoYnVmLT5zaXplID8gYnVmLT5zaXplKjIgOiBzaXplICsgMTApOworCSAgICB3aGlsZSAoc2l6ZSA+IG5ld1NpemUpIHsKKwkgICAgICAgIGlmIChuZXdTaXplID4gVUlOVF9NQVggLyAyKSB7CisJICAgICAgICAgICAgeG1sVHJlZUVyck1lbW9yeSgiZ3Jvd2luZyBidWZmZXIiKTsKKwkgICAgICAgICAgICByZXR1cm4gMDsKKwkgICAgICAgIH0KKwkgICAgICAgIG5ld1NpemUgKj0gMjsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIFhNTF9CVUZGRVJfQUxMT0NfRVhBQ1Q6CisJICAgIG5ld1NpemUgPSBzaXplKzEwOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBuZXdTaXplID0gc2l6ZSsxMDsKKwkgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKGJ1Zi0+Y29udGVudCA9PSBOVUxMKQotCXJlYnVmID0gKHhtbENoYXIgKikgeG1sTWFsbG9jQXRvbWljKG5ld1NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwotICAgIGVsc2UgaWYgKGJ1Zi0+c2l6ZSAtIGJ1Zi0+dXNlIDwgMTAwKSB7Ci0JcmVidWYgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKGJ1Zi0+Y29udGVudCwgCi0JCQkJICAgICAgIG5ld1NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwotICAgfSBlbHNlIHsKLSAgICAgICAgLyoKLQkgKiBpZiB3ZSBhcmUgcmVhbGxvY2F0aW5nIGEgYnVmZmVyIGZhciBmcm9tIGJlaW5nIGZ1bGwsIGl0J3MKLQkgKiBiZXR0ZXIgdG8gbWFrZSBhIG5ldyBhbGxvY2F0aW9uIGFuZCBjb3B5IG9ubHkgdGhlIHVzZWQgcmFuZ2UKLQkgKiBhbmQgZnJlZSB0aGUgb2xkIG9uZS4KLQkgKi8KLQlyZWJ1ZiA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhuZXdTaXplICogc2l6ZW9mKHhtbENoYXIpKTsKLQlpZiAocmVidWYgIT0gTlVMTCkgewotCSAgICBtZW1jcHkocmVidWYsIGJ1Zi0+Y29udGVudCwgYnVmLT51c2UpOwotCSAgICB4bWxGcmVlKGJ1Zi0+Y29udGVudCk7Ci0JICAgIHJlYnVmW2J1Zi0+dXNlXSA9IDA7CisgICAgaWYgKChidWYtPmFsbG9jID09IFhNTF9CVUZGRVJfQUxMT0NfSU8pICYmIChidWYtPmNvbnRlbnRJTyAhPSBOVUxMKSkgeworICAgICAgICBzdGFydF9idWYgPSBidWYtPmNvbnRlbnQgLSBidWYtPmNvbnRlbnRJTzsKKworICAgICAgICBpZiAoc3RhcnRfYnVmID4gbmV3U2l6ZSkgeworCSAgICAvKiBtb3ZlIGRhdGEgYmFjayB0byBzdGFydCAqLworCSAgICBtZW1tb3ZlKGJ1Zi0+Y29udGVudElPLCBidWYtPmNvbnRlbnQsIGJ1Zi0+dXNlKTsKKwkgICAgYnVmLT5jb250ZW50ID0gYnVmLT5jb250ZW50SU87CisJICAgIGJ1Zi0+Y29udGVudFtidWYtPnVzZV0gPSAwOworCSAgICBidWYtPnNpemUgKz0gc3RhcnRfYnVmOworCX0gZWxzZSB7CisJICAgIHJlYnVmID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhidWYtPmNvbnRlbnRJTywgc3RhcnRfYnVmICsgbmV3U2l6ZSk7CisJICAgIGlmIChyZWJ1ZiA9PSBOVUxMKSB7CisJCXhtbFRyZWVFcnJNZW1vcnkoImdyb3dpbmcgYnVmZmVyIik7CisJCXJldHVybiAwOworCSAgICB9CisJICAgIGJ1Zi0+Y29udGVudElPID0gcmVidWY7CisJICAgIGJ1Zi0+Y29udGVudCA9IHJlYnVmICsgc3RhcnRfYnVmOwogCX0KKyAgICB9IGVsc2UgeworCWlmIChidWYtPmNvbnRlbnQgPT0gTlVMTCkgeworCSAgICByZWJ1ZiA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhuZXdTaXplKTsKKwl9IGVsc2UgaWYgKGJ1Zi0+c2l6ZSAtIGJ1Zi0+dXNlIDwgMTAwKSB7CisJICAgIHJlYnVmID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhidWYtPmNvbnRlbnQsIG5ld1NpemUpOworICAgICAgICB9IGVsc2UgeworCSAgICAvKgorCSAgICAgKiBpZiB3ZSBhcmUgcmVhbGxvY2F0aW5nIGEgYnVmZmVyIGZhciBmcm9tIGJlaW5nIGZ1bGwsIGl0J3MKKwkgICAgICogYmV0dGVyIHRvIG1ha2UgYSBuZXcgYWxsb2NhdGlvbiBhbmQgY29weSBvbmx5IHRoZSB1c2VkIHJhbmdlCisJICAgICAqIGFuZCBmcmVlIHRoZSBvbGQgb25lLgorCSAgICAgKi8KKwkgICAgcmVidWYgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2NBdG9taWMobmV3U2l6ZSk7CisJICAgIGlmIChyZWJ1ZiAhPSBOVUxMKSB7CisJCW1lbWNweShyZWJ1ZiwgYnVmLT5jb250ZW50LCBidWYtPnVzZSk7CisJCXhtbEZyZWUoYnVmLT5jb250ZW50KTsKKwkJcmVidWZbYnVmLT51c2VdID0gMDsKKwkgICAgfQorCX0KKwlpZiAocmVidWYgPT0gTlVMTCkgeworCSAgICB4bWxUcmVlRXJyTWVtb3J5KCJncm93aW5nIGJ1ZmZlciIpOworCSAgICByZXR1cm4gMDsKKwl9CisJYnVmLT5jb250ZW50ID0gcmVidWY7CiAgICAgfQotICAgIGlmIChyZWJ1ZiA9PSBOVUxMKSB7Ci0JeG1sVHJlZUVyck1lbW9yeSgiZ3Jvd2luZyBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGJ1Zi0+Y29udGVudCA9IHJlYnVmOwogICAgIGJ1Zi0+c2l6ZSA9IG5ld1NpemU7CiAKICAgICByZXR1cm4gMTsKQEAgLTcwMjUsNiArNzM0NywyMCBAQAogCiAgICAgaWYgKGxlbiA8PSAwKSByZXR1cm4gLTE7CiAKKyAgICBpZiAoKGJ1Zi0+YWxsb2MgPT0gWE1MX0JVRkZFUl9BTExPQ19JTykgJiYgKGJ1Zi0+Y29udGVudElPICE9IE5VTEwpKSB7CisgICAgICAgIHNpemVfdCBzdGFydF9idWYgPSBidWYtPmNvbnRlbnQgLSBidWYtPmNvbnRlbnRJTzsKKworCWlmIChzdGFydF9idWYgPiAodW5zaWduZWQgaW50KSBsZW4pIHsKKwkgICAgLyoKKwkgICAgICogV2UgY2FuIGFkZCBpdCBpbiB0aGUgc3BhY2UgcHJldmlvdXNseSBzaHJpbmtlZAorCSAgICAgKi8KKwkgICAgYnVmLT5jb250ZW50IC09IGxlbjsKKyAgICAgICAgICAgIG1lbW1vdmUoJmJ1Zi0+Y29udGVudFswXSwgc3RyLCBsZW4pOworCSAgICBidWYtPnVzZSArPSBsZW47CisJICAgIGJ1Zi0+c2l6ZSArPSBsZW47CisJICAgIHJldHVybigwKTsKKwl9CisgICAgfQogICAgIG5lZWRTaXplID0gYnVmLT51c2UgKyBsZW4gKyAyOwogICAgIGlmIChuZWVkU2l6ZSA+IGJ1Zi0+c2l6ZSl7CiAgICAgICAgIGlmICgheG1sQnVmZmVyUmVzaXplKGJ1ZiwgbmVlZFNpemUpKXsKQEAgLTcwMzMsOCArNzM2OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZW1tb3ZlKCZidWYtPmNvbnRlbnRbbGVuXSwgJmJ1Zi0+Y29udGVudFswXSwgYnVmLT51c2UgKiBzaXplb2YoeG1sQ2hhcikpOwotICAgIG1lbW1vdmUoJmJ1Zi0+Y29udGVudFswXSwgc3RyLCBsZW4gKiBzaXplb2YoeG1sQ2hhcikpOworICAgIG1lbW1vdmUoJmJ1Zi0+Y29udGVudFtsZW5dLCAmYnVmLT5jb250ZW50WzBdLCBidWYtPnVzZSk7CisgICAgbWVtbW92ZSgmYnVmLT5jb250ZW50WzBdLCBzdHIsIGxlbik7CiAgICAgYnVmLT51c2UgKz0gbGVuOwogICAgIGJ1Zi0+Y29udGVudFtidWYtPnVzZV0gPSAwOwogICAgIHJldHVybiAwOwpAQCAtNzI4MSw3ICs3NjE3LDcgQEAKIC8qCiAqIHhtbERPTVdyYXBOc01hcEZyZWU6CiAqIEBtYXA6IHRoZSBucy1tYXAKLSogCisqCiAqIEZyZWVzIHRoZSBucy1tYXAKICovCiBzdGF0aWMgdm9pZApAQCAtNzMxMiw3ICs3NjQ4LDcgQEAKICogQG9sZE5zOiB0aGUgb2xkIG5zLXN0cnVjdAogKiBAbmV3TnM6IHRoZSBuZXcgbnMtc3RydWN0CiAqIEBkZXB0aDogZGVwdGggYW5kIG5zLWtpbmQgaW5mb3JtYXRpb24KLSogCisqCiAqIEFkZHMgYW4gbnMtbWFwcGluZyBpdGVtLgogKi8KIHN0YXRpYyB4bWxOc01hcEl0ZW1QdHIKQEAgLTczNDAsNyArNzY3Niw3IEBACiAJbWVtc2V0KG1hcCwgMCwgc2l6ZW9mKHN0cnVjdCB4bWxOc01hcCkpOwogCSpuc21hcCA9IG1hcDsKICAgICB9Ci0gICAgCisKICAgICBpZiAobWFwLT5wb29sICE9IE5VTEwpIHsKIAkvKgogCSogUmV1c2UgYW4gaXRlbSBmcm9tIHRoZSBwb29sLgpAQCAtNzM1OSwxMSArNzY5NSwxMSBAQAogCX0KIAltZW1zZXQocmV0LCAwLCBzaXplb2Yoc3RydWN0IHhtbE5zTWFwSXRlbSkpOwogICAgIH0KLSAgICAKKwogICAgIGlmIChtYXAtPmZpcnN0ID09IE5VTEwpIHsKIAkvKgogCSogRmlyc3QgZXZlci4KLQkqLwkgCisJKi8KIAltYXAtPmZpcnN0ID0gcmV0OwogCW1hcC0+bGFzdCA9IHJldDsKICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IC0xKSB7CkBAIC03MzcyLDE0ICs3NzA4LDE0IEBACiAJKi8KIAlyZXQtPnByZXYgPSBtYXAtPmxhc3Q7CiAJbWFwLT5sYXN0LT5uZXh0ID0gcmV0OwotCW1hcC0+bGFzdCA9IHJldDsJCQorCW1hcC0+bGFzdCA9IHJldDsKICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IDApIHsKIAkvKgogCSogU2V0IG9uIGZpcnN0IHBvc2l0aW9uLgogCSovCiAJbWFwLT5maXJzdC0+cHJldiA9IHJldDsKLQlyZXQtPm5leHQgPSBtYXAtPmZpcnN0OwkJCi0JbWFwLT5maXJzdCA9IHJldDsJCQorCXJldC0+bmV4dCA9IG1hcC0+Zmlyc3Q7CisJbWFwLT5maXJzdCA9IHJldDsKICAgICB9IGVsc2UKIAlyZXR1cm4oTlVMTCk7CiAKQEAgLTczOTUsMTAgKzc3MzEsMTAgQEAKICogQGRvYzogdGhlIGRvYwogKiBAbnNOYW1lOiB0aGUgbmFtZXNwYWNlIG5hbWUKICogQHByZWZpeDogdGhlIHByZWZpeAotKiAKKyoKICogQ3JlYXRlcyBvciByZXVzZXMgYW4geG1sTnMgc3RydWN0IG9uIGRvYy0+b2xkTnMgd2l0aAogKiB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBuYW1lc3BhY2UgbmFtZS4KLSogCisqCiAqIFJldHVybnMgdGhlIGFxdWlyZWQgbnMgc3RydWN0IG9yIE5VTEwgaW4gY2FzZSBvZiBhbiBBUEkKICogICAgICAgICBvciBpbnRlcm5hbCBlcnJvci4KICovCkBAIC03NDM4LDcgKzc3NzQsNyBAQAogKgogKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgbmV3IERPTS13cmFwcGVyIGNvbnRleHQuCiAqCi0qIFJldHVybnMgdGhlIHhtbERPTVdyYXBDdHh0UHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBhbiBpbnRlcm5hbCBlcnJyb3IuIAorKiBSZXR1cm5zIHRoZSB4bWxET01XcmFwQ3R4dFB0ciBvciBOVUxMIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgZXJycm9yLgogKi8KIHhtbERPTVdyYXBDdHh0UHRyCiB4bWxET01XcmFwTmV3Q3R4dCh2b2lkKQpAQCAtNzQ3Nyw5ICs3ODEzLDkgQEAKICogeG1sVHJlZUxvb2t1cE5zTGlzdEJ5UHJlZml4OgogKiBAbnNMaXN0OiBhIGxpc3Qgb2YgbnMtc3RydWN0cwogKiBAcHJlZml4OiB0aGUgc2VhcmNoZWQgcHJlZml4Ci0qIAorKgogKiBTZWFyY2hlcyBmb3IgYSBucy1kZWNsIHdpdGggdGhlIGdpdmVuIHByZWZpeCBpbiBAbnNMaXN0LgotKiAKKyoKICogUmV0dXJucyB0aGUgbnMtZGVjbCBpZiBmb3VuZCwgTlVMTCBpZiBub3QgZm91bmQgYW5kIG9uCiAqICAgICAgICAgQVBJIGVycm9ycy4KICovCkBAIC03NTA3LDkgKzc4NDMsOSBAQAogKiB4bWxET01XcmFwTlNOb3JtR2F0aGVySW5TY29wZU5zOgogKiBAbWFwOiB0aGUgbmFtZXNwYWNlIG1hcAogKiBAbm9kZTogdGhlIG5vZGUgdG8gc3RhcnQgd2l0aAotKiAKKyoKICogUHV0cyBpbi1zY29wZSBuYW1lc3BhY2VzIGludG8gdGhlIG5zLW1hcC4KLSogCisqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBBUEkgb3IgaW50ZXJuYWwgZXJyb3JzLgogKi8KIHN0YXRpYyBpbnQKQEAgLTc2MDEsNyArNzkzNyw3IEBACiAqCiAqIEZvciBpbnRlcm5hbCB1c2UuIEFkZHMgYSBucy1kZWNsIG1hcHBpbmcuCiAqCi0qIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBpbnRlcm5hbCBlcnJvcnMuIAorKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gaW50ZXJuYWwgZXJyb3JzLgogKi8KIHN0YXRpYyBpbnQKIHhtbERPTVdyYXBOU05vcm1BZGROc01hcEl0ZW0yKHhtbE5zUHRyICoqbGlzdCwgaW50ICpzaXplLCBpbnQgKm51bWJlciwKQEAgLTc2NDUsNyArNzk4MSw3IEBACiAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gd2FzIG5vdCBpbnRlbnNpdmVseSB0ZXN0ZWQuCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAxIGlmIHRoZSBub2RlIGlzIG5vdCBzdXBwb3J0ZWQsCi0qICAgICAgICAgLTEgb24gQVBJIGFuZCBpbnRlcm5hbCBlcnJvcnMuIAorKiAgICAgICAgIC0xIG9uIEFQSSBhbmQgaW50ZXJuYWwgZXJyb3JzLgogKi8KIGludAogeG1sRE9NV3JhcFJlbW92ZU5vZGUoeG1sRE9NV3JhcEN0eHRQdHIgY3R4dCwgeG1sRG9jUHRyIGRvYywKQEAgLTc2NjIsNyArNzk5OCw3IEBACiAgICAgaWYgKG5vZGUtPnBhcmVudCA9PSBOVUxMKQogCXJldHVybiAoMCk7CiAKLSAgICBzd2l0Y2ggKG5vZGUtPnR5cGUpIHsgICAgCQorICAgIHN3aXRjaCAobm9kZS0+dHlwZSkgewogCWNhc2UgWE1MX1RFWFRfTk9ERToKIAljYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CiAJY2FzZSBYTUxfRU5USVRZX1JFRl9OT0RFOgpAQCAtNzY3MCw3ICs4MDA2LDcgQEAKIAljYXNlIFhNTF9DT01NRU5UX05PREU6CiAJICAgIHhtbFVubGlua05vZGUobm9kZSk7CiAJICAgIHJldHVybiAoMCk7Ci0JY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgkgICAgCisJY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgogCWNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgogCSAgICBicmVhazsKIAlkZWZhdWx0OgpAQCAtNzY5NCw3ICs4MDMwLDcgQEAKIAkJfQogCQkvKiBObyBicmVhayBvbiBwdXJwb3NlLiAqLwogCSAgICBjYXNlIFhNTF9BVFRSSUJVVEVfTk9ERToKLQkJaWYgKG5vZGUtPm5zICE9IE5VTEwpIHsJCSAgICAKKwkJaWYgKG5vZGUtPm5zICE9IE5VTEwpIHsKIAkJICAgIC8qCiAJCSAgICAqIEZpbmQgYSBtYXBwaW5nLgogCQkgICAgKi8KQEAgLTc3MzgsMTQgKzgwNzQsMTQgQEAKIAkJYnJlYWs7CiAJICAgIGRlZmF1bHQ6CiAJCWdvdG8gbmV4dF9zaWJsaW5nOwotCX0JCi1uZXh0X25vZGU6CSAKKwl9CituZXh0X25vZGU6CiAJaWYgKChub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmCiAJICAgIChub2RlLT5jaGlsZHJlbiAhPSBOVUxMKSkgewogCSAgICBub2RlID0gbm9kZS0+Y2hpbGRyZW47CiAJICAgIGNvbnRpbnVlOwogCX0KLW5leHRfc2libGluZzoJCituZXh0X3NpYmxpbmc6CiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkgICAgYnJlYWs7CiAJaWYgKG5vZGUtPm5leHQgIT0gTlVMTCkKQEAgLTc4MzgsNyArODE3NCw3IEBACiAJCQkqLwogCQkJaWYgKG91dCkgewogCQkJICAgIGludCByZXQ7Ci0JCQkgICAgCisKIAkJCSAgICByZXQgPSB4bWxOc0luU2NvcGUoZG9jLCBub2RlLCBwcmV2LCBucy0+cHJlZml4KTsKIAkJCSAgICBpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gKC0xKTsKQEAgLTc5MDYsNyArODI0Miw3IEBACiAJaWYgKGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CiAJICAgIGlmIChjdXItPm5zRGVmICE9IE5VTEwpIHsKIAkJbnMgPSBjdXItPm5zRGVmOwotCQlkbyB7CQkKKwkJZG8gewogCQkgICAgaWYgKChwcmVmaXggPT0gbnMtPnByZWZpeCkgfHwKIAkJCXhtbFN0ckVxdWFsKHByZWZpeCwgbnMtPnByZWZpeCkpCiAJCSAgICB7CkBAIC03OTIwLDcgKzgyNTYsNyBAQAogCQkJcmV0dXJuICgxKTsKIAkJICAgIH0KIAkJICAgIG5zID0gbnMtPm5leHQ7Ci0JCX0gd2hpbGUgKG5zICE9IE5VTEwpOwkKKwkJfSB3aGlsZSAobnMgIT0gTlVMTCk7CiAJICAgIH0KIAl9IGVsc2UgaWYgKChjdXItPnR5cGUgPT0gWE1MX0VOVElUWV9OT0RFKSB8fAogICAgICAgICAgICAgKGN1ci0+dHlwZSA9PSBYTUxfRU5USVRZX0RFQ0wpKQpAQCAtODAyNywxMiArODM2MywxMiBAQAogCQkJCSAgIHhtbE5zUHRyIG5zLAogCQkJCSAgIHhtbE5zUHRyICpyZXROcywKIAkJCQkgICB4bWxOc01hcFB0ciAqbnNNYXAsCi0JCQkJICAgCisKIAkJCQkgICBpbnQgZGVwdGgsCiAJCQkJICAgaW50IGFuY2VzdG9yc09ubHksCiAJCQkJICAgaW50IHByZWZpeGVkKQogewotICAgIHhtbE5zTWFwSXRlbVB0ciBtaTsgICAgCisgICAgeG1sTnNNYXBJdGVtUHRyIG1pOwogCiAgICAgaWYgKChkb2MgPT0gTlVMTCkgfHwgKG5zID09IE5VTEwpIHx8IChyZXROcyA9PSBOVUxMKSB8fAogCShuc01hcCA9PSBOVUxMKSkKQEAgLTgwNTcsMTMgKzgzOTMsMTMgQEAKICAgICAqLwogICAgIGlmICgoWE1MX05TTUFQX05PVEVNUFRZKCpuc01hcCkpICYmCiAJKCEgKGFuY2VzdG9yc09ubHkgJiYgKGVsZW0gPT0gTlVMTCkpKSkKLSAgICB7CQorICAgIHsKIAkvKgogCSogVHJ5IHRvIGZpbmQgYW4gZXF1YWwgbnMtbmFtZSBpbiBpbi1zY29wZSBucy1kZWNscy4KIAkqLwogCVhNTF9OU01BUF9GT1JFQUNIKCpuc01hcCwgbWkpIHsKLQkgICAgaWYgKChtaS0+ZGVwdGggPj0gWE1MX1RSRUVfTlNNQVBfUEFSRU5UKSAmJiAJCQkJCi0JCS8qIAorCSAgICBpZiAoKG1pLT5kZXB0aCA+PSBYTUxfVFJFRV9OU01BUF9QQVJFTlQpICYmCisJCS8qCiAJCSogYW5jZXN0b3JzT25seTogVGhpcyBzaG91bGQgYmUgdHVybmVkIG9uIHRvIGdhaW4gc3BlZWQsCiAJCSogaWYgb25lIGtub3dzIHRoYXQgdGhlIGJyYW5jaCBpdHNlbGYgd2FzIGFscmVhZHkKIAkJKiBucy13ZWxsZm9ybWVkIGFuZCBubyBzdGFsZSByZWZlcmVuY2VzIGV4aXN0ZWQuCkBAIC04MDcxLDEwICs4NDA3LDEwIEBACiAJCSovCiAJCSgoISBhbmNlc3RvcnNPbmx5KSB8fCAobWktPmRlcHRoID09IFhNTF9UUkVFX05TTUFQX1BBUkVOVCkpICYmCiAJCS8qIFNraXAgc2hhZG93ZWQgcHJlZml4ZXMuICovCi0JCShtaS0+c2hhZG93RGVwdGggPT0gLTEpICYmCQkKKwkJKG1pLT5zaGFkb3dEZXB0aCA9PSAtMSkgJiYKIAkJLyogU2tpcCB4bWxucz0iIiBvciB4bWxuczpmb289IiIuICovCiAJCSgobWktPm5ld05zLT5ocmVmICE9IE5VTEwpICYmCi0JCShtaS0+bmV3TnMtPmhyZWZbMF0gIT0gMCkpICYmCQkKKwkJKG1pLT5uZXdOcy0+aHJlZlswXSAhPSAwKSkgJiYKIAkJLyogRW5zdXJlIGEgcHJlZml4IGlmIHdhbnRlZC4gKi8KIAkJKCghIHByZWZpeGVkKSB8fCAobWktPm5ld05zLT5wcmVmaXggIT0gTlVMTCkpICYmCiAJCS8qIEVxdWFsIG5zIG5hbWUgKi8KQEAgLTgxMDEsNyArODQzNyw3IEBACiAJICAgIHJldHVybiAoLTEpOwogCS8qCiAJKiBJbnNlcnQgbWFwcGluZy4KLQkqLwkKKwkqLwogCWlmICh4bWxET01XcmFwTnNNYXBBZGRJdGVtKG5zTWFwLCAtMSwgbnMsCiAJCXRtcG5zLCBYTUxfVFJFRV9OU01BUF9ET0MpID09IE5VTEwpIHsKIAkgICAgeG1sRnJlZU5zKHRtcG5zKTsKQEAgLTgxNDMsNyArODQ3OSw3IEBACiB9CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgWE1MX0RPTV9SRUNPTk5TX1JFTU9WRVJFRFVORCA9IDE8PDAgICAgCisgICAgWE1MX0RPTV9SRUNPTk5TX1JFTU9WRVJFRFVORCA9IDE8PDAKIH0geG1sRE9NUmVjb25jaWxlTlNPcHRpb25zOwogCiAvKgpAQCAtODE2MSw3ICs4NDk3LDcgQEAKICogTk9URTogVGhpcyBmdW5jdGlvbiB3YXMgbm90IGludGVuc2l2ZWx5IHRlc3RlZC4KICoKICogUmV0dXJucyAwIGlmIHN1Y2NlZWRlZCwgLTEgb3RoZXJ3aXNlIGFuZCBvbiBBUEkvaW50ZXJuYWwgZXJyb3JzLgotKi8gICAKKyovCiAKIGludAogeG1sRE9NV3JhcFJlY29uY2lsZU5hbWVzcGFjZXMoeG1sRE9NV3JhcEN0eHRQdHIgY3R4dCBBVFRSSUJVVEVfVU5VU0VELApAQCAtODE3Niw3ICs4NTEyLDcgQEAKICAgICB4bWxOc01hcEl0ZW1QdHIgLyogdG9wbWkgPSBOVUxMLCAqLyBtaTsKICAgICAvKiBAYW5jZXN0b3JzT25seSBzaG91bGQgYmUgc2V0IGJ5IGFuIG9wdGlvbiBmbGFnLiAqLwogICAgIGludCBhbmNlc3RvcnNPbmx5ID0gMDsKLSAgICBpbnQgb3B0UmVtb3ZlUmVkdW5kYW50TlMgPSAKKyAgICBpbnQgb3B0UmVtb3ZlUmVkdW5kYW50TlMgPQogCSgoeG1sRE9NUmVjb25jaWxlTlNPcHRpb25zKSBvcHRpb25zICYgWE1MX0RPTV9SRUNPTk5TX1JFTU9WRVJFRFVORCkgPyAxIDogMDsKICAgICB4bWxOc1B0ciAqbGlzdFJlZHVuZCA9IE5VTEw7CiAgICAgaW50IHNpemVSZWR1bmQgPSAwLCBuYlJlZHVuZCA9IDAsIHJldCwgaSwgajsKQEAgLTgyMTIsNyArODU0OCw3IEBACiAJCQkgICAgfQogCQkJICAgIHBhcm5zZG9uZSA9IDE7CiAJCQl9Ci0JCQkKKwogCQkJLyoKIAkJCSogTG9va3VwIHRoZSBucyBhbmNlc3Rvci1heGlzIGZvciBlcXVhbCBucy1kZWNscyBpbiBzY29wZS4KIAkJCSovCkBAIC04MjI0LDcgKzg1NjAsNyBAQAogCQkJCSAgICAgIHhtbFN0ckVxdWFsKG5zLT5wcmVmaXgsIG1pLT5uZXdOcy0+cHJlZml4KSkgJiYKIAkJCQkgICAgKChucy0+aHJlZiA9PSBtaS0+bmV3TnMtPmhyZWYpIHx8CiAJCQkJICAgICAgeG1sU3RyRXF1YWwobnMtPmhyZWYsIG1pLT5uZXdOcy0+aHJlZikpKQotCQkJCXsJCQkJICAgIAorCQkJCXsKIAkJCQkgICAgLyoKIAkJCQkgICAgKiBBIHJlZHVuZGFudCBucy1kZWNsIHdhcyBmb3VuZC4KIAkJCQkgICAgKiBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcmVkdW5kYW50IG5zLWRlY2xzLgpAQCAtODIzNCwxMSArODU3MCwxMSBAQAogCQkJCQlnb3RvIGludGVybmFsX2Vycm9yOwogCQkJCSAgICAvKgogCQkJCSAgICAqIFJlbW92ZSB0aGUgbnMtZGVjbCBmcm9tIHRoZSBlbGVtZW50LW5vZGUuCi0JCQkJICAgICovCQkJCSAgICAKKwkJCQkgICAgKi8KIAkJCQkgICAgaWYgKHByZXZucykKIAkJCQkJcHJldm5zLT5uZXh0ID0gbnMtPm5leHQ7CiAJCQkJICAgIGVsc2UKLQkJCQkJY3VyLT5uc0RlZiA9IG5zLT5uZXh0OwkJCQkgICAgCQkJCSAgICAKKwkJCQkJY3VyLT5uc0RlZiA9IG5zLT5uZXh0OwogCQkJCSAgICBnb3RvIG5leHRfbnNfZGVjbDsKIAkJCQl9CiAJCQkgICAgfQpAQCAtODI0OSw3ICs4NTg1LDcgQEAKIAkJCSogbnMtZGVjbCBpcyBkZWNsYXJlZCBvbiB0aGUgc2FtZSBlbGVtZW50LgogCQkJKi8KIAkJCWlmICgoY3VyLT5ucyAhPSBOVUxMKSAmJiBhZG9wdG5zICYmIChjdXItPm5zID09IG5zKSkKLQkJCSAgICBhZG9wdG5zID0gMDsJCQkJCQkKKwkJCSAgICBhZG9wdG5zID0gMDsKIAkJCS8qCiAJCQkqIERvZXMgaXQgc2hhZG93IGFueSBucy1kZWNsPwogCQkJKi8KQEAgLTgyNTksNyArODU5NSw3IEBACiAJCQkJICAgIChtaS0+c2hhZG93RGVwdGggPT0gLTEpICYmCiAJCQkJICAgICgobnMtPnByZWZpeCA9PSBtaS0+bmV3TnMtPnByZWZpeCkgfHwKIAkJCQkgICAgeG1sU3RyRXF1YWwobnMtPnByZWZpeCwgbWktPm5ld05zLT5wcmVmaXgpKSkgewotCQkJCSAgICAKKwogCQkJCSAgICBtaS0+c2hhZG93RGVwdGggPSBkZXB0aDsKIAkJCQl9CiAJCQkgICAgfQpAQCAtODI2OSwxMSArODYwNSwxMSBAQAogCQkJKi8KIAkJCWlmICh4bWxET01XcmFwTnNNYXBBZGRJdGVtKCZuc01hcCwgLTEsIG5zLCBucywKIAkJCSAgICBkZXB0aCkgPT0gTlVMTCkKLQkJCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwkJCQorCQkJICAgIGdvdG8gaW50ZXJuYWxfZXJyb3I7CiAKIAkJCXByZXZucyA9IG5zOwogbmV4dF9uc19kZWNsOgotCQkJbnMgPSBucy0+bmV4dDsJCQkKKwkJCW5zID0gbnMtPm5leHQ7CiAJCSAgICB9CiAJCX0KIAkJaWYgKCEgYWRvcHRucykKQEAgLTgyODMsNyArODYxOSw3IEBACiAJCS8qIE5vIG5zLCBubyBmdW4uICovCiAJCWlmIChjdXItPm5zID09IE5VTEwpCiAJCSAgICBnb3RvIG5zX2VuZDsKLQkJCisKIAkJaWYgKCEgcGFybnNkb25lKSB7CiAJCSAgICBpZiAoKGVsZW0tPnBhcmVudCkgJiYKIAkJCSgoeG1sTm9kZVB0cikgZWxlbS0+cGFyZW50LT5kb2MgIT0gZWxlbS0+cGFyZW50KSkgewpAQCAtODMwMiw3ICs4NjM4LDcgQEAKIAkJCSAgIGN1ci0+bnMgPSBsaXN0UmVkdW5kWysral07CiAJCQkgICBicmVhazsKIAkJICAgICAgIH0KLQkJICAgfSAKKwkJICAgfQogCQl9CiAJCS8qCiAJCSogQWRvcHQgbnMtcmVmZXJlbmNlcy4KQEAgLTgzNDAsNyArODY3Niw3IEBACiAJCSAgICBjdXIgPSAoeG1sTm9kZVB0cikgY3VyLT5wcm9wZXJ0aWVzOwogCQkgICAgY29udGludWU7CiAJCX0KLQkJYnJlYWs7CQkKKwkJYnJlYWs7CiAJICAgIGRlZmF1bHQ6CiAJCWdvdG8gbmV4dF9zaWJsaW5nOwogCX0KQEAgLTgzNTMsMTggKzg2ODksMTggQEAKIAkgICAgY3VyID0gY3VyLT5jaGlsZHJlbjsKIAkgICAgY29udGludWU7CiAJfQotbmV4dF9zaWJsaW5nOgkKK25leHRfc2libGluZzoKIAlpZiAoY3VyID09IGVsZW0pCiAJICAgIGJyZWFrOwogCWlmIChjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgewotCSAgICBpZiAoWE1MX05TTUFQX05PVEVNUFRZKG5zTWFwKSkgewkgICAgCisJICAgIGlmIChYTUxfTlNNQVBfTk9URU1QVFkobnNNYXApKSB7CiAJCS8qCiAJCSogUG9wIG1hcHBpbmdzLgogCQkqLwogCQl3aGlsZSAoKG5zTWFwLT5sYXN0ICE9IE5VTEwpICYmCiAJCSAgICAobnNNYXAtPmxhc3QtPmRlcHRoID49IGRlcHRoKSkKIAkJewotCQkgICAgWE1MX05TTUFQX1BPUChuc01hcCwgbWkpCQkgICAgCisJCSAgICBYTUxfTlNNQVBfUE9QKG5zTWFwLCBtaSkKIAkJfQogCQkvKgogCQkqIFVuc2hhZG93LgpAQCAtODM3Myw3ICs4NzA5LDcgQEAKIAkJICAgIGlmIChtaS0+c2hhZG93RGVwdGggPj0gZGVwdGgpCiAJCQltaS0+c2hhZG93RGVwdGggPSAtMTsKIAkJfQotCSAgICB9CSAgICAKKwkgICAgfQogCSAgICBkZXB0aC0tOwogCX0KIAlpZiAoY3VyLT5uZXh0ICE9IE5VTEwpCkBAIC04Mzg3LDEzICs4NzIzLDEzIEBACiAJICAgIGdvdG8gbmV4dF9zaWJsaW5nOwogCX0KICAgICB9IHdoaWxlIChjdXIgIT0gTlVMTCk7Ci0gICAgCisKICAgICByZXQgPSAwOwogICAgIGdvdG8gZXhpdDsKIGludGVybmFsX2Vycm9yOgogICAgIHJldCA9IC0xOwogZXhpdDoKLSAgICBpZiAobGlzdFJlZHVuZCkgewkKKyAgICBpZiAobGlzdFJlZHVuZCkgewogCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmJSZWR1bmQ7IGkrKywgaiArPSAyKSB7CiAJICAgIHhtbEZyZWVOcyhsaXN0UmVkdW5kW2pdKTsKIAl9CkBAIC04NDQ0LDcgKzg3ODAsNyBAQAogICAgIGludCBwYXJuc2RvbmU7CiAgICAgLyogQGFuY2VzdG9yc09ubHkgc2hvdWxkIGJlIHNldCBwZXIgb3B0aW9uLiAqLwogICAgIGludCBhbmNlc3RvcnNPbmx5ID0gMDsKLSAgICAKKwogICAgIC8qCiAgICAgKiBPcHRpbWl6ZSBzdHJpbmcgYWRvcHRpb24gZm9yIGVxdWFsIG9yIG5vbmUgZGljdHMuCiAgICAgKi8KQEAgLTg0OTgsMTcgKzg4MzQsMTcgQEAKIAl9CiAJY3VyLT5kb2MgPSBkZXN0RG9jOwogCXN3aXRjaCAoY3VyLT50eXBlKSB7Ci0JICAgIGNhc2UgWE1MX1hJTkNMVURFX1NUQVJUOgkJCisJICAgIGNhc2UgWE1MX1hJTkNMVURFX1NUQVJUOgogCSAgICBjYXNlIFhNTF9YSU5DTFVERV9FTkQ6CiAJCS8qCiAJCSogVE9ETwogCQkqLwogCQlyZXR1cm4gKC0xKTsKLQkgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOiAgIAkKKwkgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgogCQljdXJFbGVtID0gY3VyOwogCQlkZXB0aCsrOwogCQkvKgotCQkqIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCQkKKwkJKiBOYW1lc3BhY2UgZGVjbGFyYXRpb25zLgogCQkqIC0gbnMtPmhyZWYgYW5kIG5zLT5wcmVmaXggYXJlIG5ldmVyIGluIHRoZSBkaWN0LCBzbwogCQkqICAgd2UgbmVlZCBub3QgbW92ZSB0aGUgdmFsdWVzIG92ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGRpY3QuCiAJCSogLSBOb3RlIHRoYXQgZm9yIGN1c3RvbSBoYW5kbGluZyBvZiBucy1yZWZlcmVuY2VzLApAQCAtODUzMiwxMCArODg2OCwxMCBAQAogCQkJKiBOT1RFOiBucy0+cHJlZml4IGFuZCBucy0+aHJlZiBhcmUgbmV2ZXIgaW4gdGhlIGRpY3QuCiAJCQkqIFhNTF9UUkVFX0FET1BUX1NUUihucy0+cHJlZml4KQogCQkJKiBYTUxfVFJFRV9BRE9QVF9TVFIobnMtPmhyZWYpCi0JCQkqLwkJCQorCQkJKi8KIAkJCS8qCiAJCQkqIERvZXMgaXQgc2hhZG93IGFueSBucy1kZWNsPwotCQkJKi8JCQkKKwkJCSovCiAJCQlpZiAoWE1MX05TTUFQX05PVEVNUFRZKG5zTWFwKSkgewogCQkJICAgIFhNTF9OU01BUF9GT1JFQUNIKG5zTWFwLCBtaSkgewogCQkJCWlmICgobWktPmRlcHRoID49IFhNTF9UUkVFX05TTUFQX1BBUkVOVCkgJiYKQEAgLTg1NDMsNyArODg3OSw3IEBACiAJCQkJICAgICgobnMtPnByZWZpeCA9PSBtaS0+bmV3TnMtPnByZWZpeCkgfHwKIAkJCQkgICAgeG1sU3RyRXF1YWwobnMtPnByZWZpeCwKIAkJCQkgICAgbWktPm5ld05zLT5wcmVmaXgpKSkgewotCQkJCSAgICAKKwogCQkJCSAgICBtaS0+c2hhZG93RGVwdGggPSBkZXB0aDsKIAkJCQl9CiAJCQkgICAgfQpAQCAtODYwNiw3ICs4OTQyLDcgQEAKIAkJICAgICogQXF1aXJlIGEgbm9ybWFsaXplZCBucy1kZWNsIGFuZCBhZGQgaXQgdG8gdGhlIG1hcC4KIAkJICAgICovCiAJCSAgICBpZiAoeG1sRE9NV3JhcE5TTm9ybUFxdWlyZU5vcm1hbGl6ZWROcyhkZXN0RG9jLAotCQkJLyogbnMtZGVjbHMgb24gY3VyRWxlbSBvciBvbiBkZXN0RG9jLT5vbGROcyAqLwkJCQorCQkJLyogbnMtZGVjbHMgb24gY3VyRWxlbSBvciBvbiBkZXN0RG9jLT5vbGROcyAqLwogCQkJZGVzdFBhcmVudCA/IGN1ckVsZW0gOiBOVUxMLAogCQkJY3VyLT5ucywgJm5zLAogCQkJJm5zTWFwLCBkZXB0aCwKQEAgLTg2NDIsNyArODk3OCw3IEBACiAJCSAgICAqLwogCQkgICAgaWYgKChzb3VyY2VEb2MgIT0gTlVMTCkgJiYKIAkJCSgoKHhtbEF0dHJQdHIpIGN1ciktPmF0eXBlID09IFhNTF9BVFRSSUJVVEVfSUQpKQotCQkgICAgewkJCQorCQkgICAgewogCQkJeG1sUmVtb3ZlSUQoc291cmNlRG9jLCAoeG1sQXR0clB0cikgY3VyKTsKIAkJICAgIH0KIAkJICAgICgoeG1sQXR0clB0cikgY3VyKS0+YXR5cGUgPSAwOwpAQCAtODY1MCwxMyArODk4NiwxMyBAQAogCQl9CiAJCWJyZWFrOwogCSAgICBjYXNlIFhNTF9URVhUX05PREU6Ci0JICAgIGNhc2UgWE1MX0NEQVRBX1NFQ1RJT05fTk9ERToJCQorCSAgICBjYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CiAJCS8qCiAJCSogVGhpcyBwdXRzIHRoZSBjb250ZW50IGluIHRoZSBkZXN0IGRpY3QsIG9ubHkgaWYKIAkJKiBpdCB3YXMgcHJldmlvdXNseSBpbiB0aGUgc291cmNlIGRpY3QuCiAJCSovCi0JCVhNTF9UUkVFX0FET1BUX1NUUl8yKGN1ci0+Y29udGVudCkJCQotCQlnb3RvIGxlYXZlX25vZGU7CSAgIAorCQlYTUxfVFJFRV9BRE9QVF9TVFJfMihjdXItPmNvbnRlbnQpCisJCWdvdG8gbGVhdmVfbm9kZTsKIAkgICAgY2FzZSBYTUxfRU5USVRZX1JFRl9OT0RFOgogCQkvKgogCQkqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGVudGl0aXR5LW5vZGUuCkBAIC04NjgxLDcgKzkwMTcsNyBAQAogCQlYTUxfVFJFRV9BRE9QVF9TVFIoY3VyLT5uYW1lKQogCQlYTUxfVFJFRV9BRE9QVF9TVFJfMihjdXItPmNvbnRlbnQpCiAJCWJyZWFrOwotCSAgICBjYXNlIFhNTF9DT01NRU5UX05PREU6CSAgICAKKwkgICAgY2FzZSBYTUxfQ09NTUVOVF9OT0RFOgogCQlicmVhazsKIAkgICAgZGVmYXVsdDoKIAkJZ290byBpbnRlcm5hbF9lcnJvcjsKQEAgLTg3MDQsMTUgKzkwNDAsMTUgQEAKIAkgICAgLyoKIAkgICAgKiBUT0RPOiBEbyB3ZSBleHBlY3QgbnNEZWZzIG9uIFhNTF9YSU5DTFVERV9TVEFSVD8KIAkgICAgKi8KLQkgICAgaWYgKFhNTF9OU01BUF9OT1RFTVBUWShuc01hcCkpIHsJICAgIAorCSAgICBpZiAoWE1MX05TTUFQX05PVEVNUFRZKG5zTWFwKSkgewogCQkvKgogCQkqIFBvcCBtYXBwaW5ncy4KIAkJKi8KIAkJd2hpbGUgKChuc01hcC0+bGFzdCAhPSBOVUxMKSAmJgogCQkgICAgKG5zTWFwLT5sYXN0LT5kZXB0aCA+PSBkZXB0aCkpCiAJCXsKLQkJICAgIFhNTF9OU01BUF9QT1AobnNNYXAsIG1pKQkJICAgIAotCQl9CQkKKwkJICAgIFhNTF9OU01BUF9QT1AobnNNYXAsIG1pKQorCQl9CiAJCS8qCiAJCSogVW5zaGFkb3cuCiAJCSovCkBAIC04NzM0LDEwICs5MDcwLDEwIEBACiAJICAgIGdvdG8gbGVhdmVfbm9kZTsKIAl9CiAgICAgfQotICAgIAorCiAgICAgZ290byBleGl0OwogCi1pbnRlcm5hbF9lcnJvcjogICAgCitpbnRlcm5hbF9lcnJvcjoKICAgICByZXQgPSAtMTsKIAogZXhpdDoKQEAgLTg3NTUsNyArOTA5MSw3IEBACiAJCW5zTWFwLT5wb29sID0gbnNNYXAtPmZpcnN0OwogCQluc01hcC0+Zmlyc3QgPSBOVUxMOwogCSAgICB9Ci0JfSBlbHNlICAgIAorCX0gZWxzZQogCSAgICB4bWxET01XcmFwTnNNYXBGcmVlKG5zTWFwKTsKICAgICB9CiAgICAgcmV0dXJuKHJldCk7CkBAIC04Nzc3LDcgKzkxMTMsNyBAQAogKiAyKSBJZiAqbm8qIEBkZXN0UGFyZW50IGlzIGdpdmVuLCB0aGVuIEBkZXN0RG9jLT5vbGROcyBlbnRyaWVzIGFyZSB1c2VkLgogKiAgICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4geW91IGRvbid0IGtub3cgYWxyZWFkeSB3aGVyZSB0aGUgY2xvbmVkIGJyYW5jaAogKiAgICB3aWxsIGJlIGFkZGVkIHRvLgotKiAKKyoKICogSWYgQGRlc3RQYXJlbnQgaXMgZ2l2ZW4sIGl0IGVuc3VyZXMgdGhhdCB0aGUgdHJlZSBpcyBuYW1lc3BhY2UKICogd2VsbGZvcm1lZCBieSBjcmVhdGluZyBhZGRpdGlvbmFsIG5zLWRlY2xzIHdoZXJlIG5lZWRlZC4KICogTm90ZSB0aGF0LCBzaW5jZSBwcmVmaXhlcyBvZiBhbHJlYWR5IGV4aXN0ZW50IG5zLWRlY2xzIGNhbiBiZQpAQCAtODgxMSw3ICs5MTQ3LDcgQEAKICAgICAvKiBnYXRoZXIgQHBhcmVudCdzIG5zLWRlY2xzLiAqLwogICAgIGludCBwYXJuc2RvbmUgPSAwOwogICAgIC8qCi0gICAgKiBAYW5jZXN0b3JzT25seTogCisgICAgKiBAYW5jZXN0b3JzT25seToKICAgICAqIFRPRE86IEBhbmNlc3RvcnNPbmx5IHNob3VsZCBiZSBzZXQgcGVyIG9wdGlvbi4KICAgICAqCiAgICAgKi8KQEAgLTg4MzgsNyArOTE3NCw3IEBACiAJcmV0dXJuICgtMSk7CiAgICAgfQogICAgIGlmIChzb3VyY2VEb2MgPT0gTlVMTCkKLQlzb3VyY2VEb2MgPSBub2RlLT5kb2M7ICAgIAorCXNvdXJjZURvYyA9IG5vZGUtPmRvYzsKICAgICBpZiAoc291cmNlRG9jID09IE5VTEwpCiAgICAgICAgIHJldHVybiAoLTEpOwogCkBAIC04ODUwLDcgKzkxODYsNyBAQAogCW5zTWFwID0gKHhtbE5zTWFwUHRyKSBjdHh0LT5uYW1lc3BhY2VNYXA7CiAKICAgICAqcmVzTm9kZSA9IE5VTEw7Ci0gICAKKwogICAgIGN1ciA9IG5vZGU7CiAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7CiAJaWYgKGN1ci0+ZG9jICE9IHNvdXJjZURvYykgewpAQCAtODg1OSw3ICs5MTk1LDcgQEAKIAkgICAgKiBUT0RPOiBEbyB3ZSBuZWVkIHRvIHJlY29uY2lsaWF0ZSBYSW5jbHVkZWQgbm9kZXM/CiAJICAgICogVE9ETzogVGhpcyBoZXJlIHJldHVybnMgLTEgaW4gdGhpcyBjYXNlLgogCSAgICAqLwotCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwkKKwkgICAgZ290byBpbnRlcm5hbF9lcnJvcjsKIAl9CiAJLyoKIAkqIENyZWF0ZSBhIG5ldyBub2RlLgpAQCAtODg3NCw5ICs5MjEwLDkgQEAKIAkJYnJlYWs7CiAJICAgIGNhc2UgWE1MX0VMRU1FTlRfTk9ERToKIAkgICAgY2FzZSBYTUxfVEVYVF9OT0RFOgotCSAgICBjYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CSAgICAKKwkgICAgY2FzZSBYTUxfQ0RBVEFfU0VDVElPTl9OT0RFOgogCSAgICBjYXNlIFhNTF9DT01NRU5UX05PREU6Ci0JICAgIGNhc2UgWE1MX1BJX05PREU6CSAgICAKKwkgICAgY2FzZSBYTUxfUElfTk9ERToKIAkgICAgY2FzZSBYTUxfRE9DVU1FTlRfRlJBR19OT0RFOgogCSAgICBjYXNlIFhNTF9FTlRJVFlfUkVGX05PREU6CiAJICAgIGNhc2UgWE1MX0VOVElUWV9OT0RFOgpAQCAtODg4OCwyMCArOTIyNCwyMCBAQAogCQkgICAgeG1sVHJlZUVyck1lbW9yeSgieG1sRE9NV3JhcENsb25lTm9kZSgpOiBhbGxvY2F0aW5nIGEgbm9kZSIpOwogCQkgICAgZ290byBpbnRlcm5hbF9lcnJvcjsKIAkJfQotCQltZW1zZXQoY2xvbmUsIDAsIHNpemVvZih4bWxOb2RlKSk7CQkKKwkJbWVtc2V0KGNsb25lLCAwLCBzaXplb2YoeG1sTm9kZSkpOwogCQkvKgogCQkqIFNldCBoaWVyYWNoaWNhbCBsaW5rcy4KIAkJKi8KLQkJaWYgKHJlc3VsdENsb25lICE9IE5VTEwpIHsJICAgIAorCQlpZiAocmVzdWx0Q2xvbmUgIT0gTlVMTCkgewogCQkgICAgY2xvbmUtPnBhcmVudCA9IHBhcmVudENsb25lOwogCQkgICAgaWYgKHByZXZDbG9uZSkgewogCQkJcHJldkNsb25lLT5uZXh0ID0gY2xvbmU7CiAJCQljbG9uZS0+cHJldiA9IHByZXZDbG9uZTsKLQkJICAgIH0gZWxzZSAKKwkJICAgIH0gZWxzZQogCQkJcGFyZW50Q2xvbmUtPmNoaWxkcmVuID0gY2xvbmU7CiAJCX0gZWxzZQogCQkgICAgcmVzdWx0Q2xvbmUgPSBjbG9uZTsKLQkJCisKIAkJYnJlYWs7CiAJICAgIGNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgogCQkvKgpAQCAtODkxMiw3ICs5MjQ4LDcgQEAKIAkJICAgIHhtbFRyZWVFcnJNZW1vcnkoInhtbERPTVdyYXBDbG9uZU5vZGUoKTogYWxsb2NhdGluZyBhbiBhdHRyLW5vZGUiKTsKIAkJICAgIGdvdG8gaW50ZXJuYWxfZXJyb3I7CiAJCX0KLQkJbWVtc2V0KGNsb25lLCAwLCBzaXplb2YoeG1sQXR0cikpOwkJCisJCW1lbXNldChjbG9uZSwgMCwgc2l6ZW9mKHhtbEF0dHIpKTsKIAkJLyoKIAkJKiBTZXQgaGllcmFjaGljYWwgbGlua3MuCiAJCSogVE9ETzogQ2hhbmdlIHRoaXMgdG8gYWRkIHRvIHRoZSBlbmQgb2YgYXR0cmlidXRlcy4KQEAgLTg5MjIsNyArOTI1OCw3IEBACiAJCSAgICBpZiAocHJldkNsb25lKSB7CiAJCQlwcmV2Q2xvbmUtPm5leHQgPSBjbG9uZTsKIAkJCWNsb25lLT5wcmV2ID0gcHJldkNsb25lOwotCQkgICAgfSBlbHNlIAorCQkgICAgfSBlbHNlCiAJCQlwYXJlbnRDbG9uZS0+cHJvcGVydGllcyA9ICh4bWxBdHRyUHRyKSBjbG9uZTsKIAkJfSBlbHNlCiAJCSAgICByZXN1bHRDbG9uZSA9IGNsb25lOwpAQCAtODkzNSw4ICs5MjcxLDggQEAKIAl9CiAKIAljbG9uZS0+dHlwZSA9IGN1ci0+dHlwZTsKLQljbG9uZS0+ZG9jID0gZGVzdERvYzsJCi0JCQorCWNsb25lLT5kb2MgPSBkZXN0RG9jOworCiAJLyoKIAkqIENsb25lIHRoZSBuYW1lIG9mIHRoZSBub2RlIGlmIGFueS4KIAkqLwpAQCAtODk0NiwxNCArOTI4MiwxNCBAQAogCSAgICAvKgogCSAgICAqIE5PVEU6IEFsdGhvdWdoIHhtbFN0cmluZ1RleHROb2VuYyBpcyBuZXZlciBhc3NpZ25lZCB0byBhIG5vZGUKIAkgICAgKiAgIGluIHRyZWUuYywgaXQgbWlnaHQgYmUgc2V0IGluIExpYnhzbHQgdmlhCi0JICAgICogICAieHNsOmRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIi4JICAgCisJICAgICogICAieHNsOmRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIi4KIAkgICAgKi8KIAkgICAgY2xvbmUtPm5hbWUgPSB4bWxTdHJpbmdUZXh0Tm9lbmM7CiAJZWxzZSBpZiAoY3VyLT5uYW1lID09IHhtbFN0cmluZ0NvbW1lbnQpCiAJICAgIGNsb25lLT5uYW1lID0geG1sU3RyaW5nQ29tbWVudDsKIAllbHNlIGlmIChjdXItPm5hbWUgIT0gTlVMTCkgewogCSAgICBESUNUX0NPTlNUX0NPUFkoY3VyLT5uYW1lLCBjbG9uZS0+bmFtZSk7Ci0JfQkJCQkgICAgCisJfQogCiAJc3dpdGNoIChjdXItPnR5cGUpIHsKIAkgICAgY2FzZSBYTUxfWElOQ0xVREVfU1RBUlQ6CkBAIC04OTc2LDcgKzkzMTIsNyBAQAogCQkJICAgICovCiAJCQkgICAgaWYgKHhtbERPTVdyYXBOU05vcm1HYXRoZXJJblNjb3BlTnMoJm5zTWFwLAogCQkJCWRlc3RQYXJlbnQpID09IC0xKQotCQkJCWdvdG8gaW50ZXJuYWxfZXJyb3I7CQkJICAgIAorCQkJCWdvdG8gaW50ZXJuYWxfZXJyb3I7CiAJCQl9CiAJCQlwYXJuc2RvbmUgPSAxOwogCQkgICAgfQpAQCAtODk5Niw3ICs5MzMyLDcgQEAKIAkJCX0KIAkJCW1lbXNldChjbG9uZU5zLCAwLCBzaXplb2YoeG1sTnMpKTsKIAkJCWNsb25lTnMtPnR5cGUgPSBYTUxfTE9DQUxfTkFNRVNQQUNFOwotCQkJCisKIAkJCWlmIChucy0+aHJlZiAhPSBOVUxMKQogCQkJICAgIGNsb25lTnMtPmhyZWYgPSB4bWxTdHJkdXAobnMtPmhyZWYpOwogCQkJaWYgKG5zLT5wcmVmaXggIT0gTlVMTCkKQEAgLTkwMTcsNyArOTM1Myw3IEBACiAJCQkgICAgKiBEb2VzIGl0IHNoYWRvdyBhbnkgbnMtZGVjbD8KIAkJCSAgICAqLwogCQkJICAgIGlmIChYTUxfTlNNQVBfTk9URU1QVFkobnNNYXApKSB7Ci0JCQkJWE1MX05TTUFQX0ZPUkVBQ0gobnNNYXAsIG1pKSB7CQkJCQorCQkJCVhNTF9OU01BUF9GT1JFQUNIKG5zTWFwLCBtaSkgewogCQkJCSAgICBpZiAoKG1pLT5kZXB0aCA+PSBYTUxfVFJFRV9OU01BUF9QQVJFTlQpICYmCiAJCQkJCShtaS0+c2hhZG93RGVwdGggPT0gLTEpICYmCiAJCQkJCSgobnMtPnByZWZpeCA9PSBtaS0+bmV3TnMtPnByZWZpeCkgfHwKQEAgLTkwNDIsNyArOTM3OCw3IEBACiAJCX0KIAkJLyogY3VyLT5ucyB3aWxsIGJlIHByb2Nlc3NlZCBmdXJ0aGVyIGRvd24uICovCiAJCWJyZWFrOwotCSAgICBjYXNlIFhNTF9BVFRSSUJVVEVfTk9ERToJCQkJCisJICAgIGNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgogCQkvKiBJRHMgd2lsbCBiZSBwcm9jZXNzZWQgZnVydGhlciBkb3duLiAqLwogCQkvKiBjdXItPm5zIHdpbGwgYmUgcHJvY2Vzc2VkIGZ1cnRoZXIgZG93bi4gKi8KIAkJYnJlYWs7CkBAIC05MDUxLDEyICs5Mzg3LDEyIEBACiAJCS8qCiAJCSogTm90ZSB0aGF0IHRoaXMgd2lsbCBhbHNvIGNvdmVyIHRoZSB2YWx1ZXMgb2YgYXR0cmlidXRlcy4KIAkJKi8KLQkJRElDVF9DT1BZKGN1ci0+Y29udGVudCwgY2xvbmUtPmNvbnRlbnQpOwkJCisJCURJQ1RfQ09QWShjdXItPmNvbnRlbnQsIGNsb25lLT5jb250ZW50KTsKIAkJZ290byBsZWF2ZV9ub2RlOwogCSAgICBjYXNlIFhNTF9FTlRJVFlfTk9ERToKIAkJLyogVE9ETzogV2hhdCB0byBkbyBoZXJlPyAqLwogCQlnb3RvIGxlYXZlX25vZGU7Ci0JICAgIGNhc2UgWE1MX0VOVElUWV9SRUZfTk9ERToJCQorCSAgICBjYXNlIFhNTF9FTlRJVFlfUkVGX05PREU6CiAJCWlmIChzb3VyY2VEb2MgIT0gZGVzdERvYykgewogCQkgICAgaWYgKChkZXN0RG9jLT5pbnRTdWJzZXQpIHx8IChkZXN0RG9jLT5leHRTdWJzZXQpKSB7CiAJCQl4bWxFbnRpdHlQdHIgZW50OwpAQCAtOTA5NiwxMyArOTQzMiwxMyBAQAogLyogaGFuZGxlX25zX3JlZmVyZW5jZTogKi8KIAkvKgogCSoqIFRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGNhcmUgb2YgcmVmZXJlbmNlcyB0byBucy1kZWNscyAqKioqKioqKgotCSoqIGFuZCBpcyBpbnRlbmRlZCBvbmx5IGZvciBlbGVtZW50LSBhbmQgYXR0cmlidXRlLW5vZGVzLgkKKwkqKiBhbmQgaXMgaW50ZW5kZWQgb25seSBmb3IgZWxlbWVudC0gYW5kIGF0dHJpYnV0ZS1ub2Rlcy4KIAkqKgogCSovCiAJaWYgKCEgcGFybnNkb25lKSB7CiAJICAgIGlmIChkZXN0UGFyZW50ICYmIChjdHh0ID09IE5VTEwpKSB7CiAJCWlmICh4bWxET01XcmFwTlNOb3JtR2F0aGVySW5TY29wZU5zKCZuc01hcCwgZGVzdFBhcmVudCkgPT0gLTEpCi0JCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwkJCisJCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwogCSAgICB9CiAJICAgIHBhcm5zZG9uZSA9IDE7CiAJfQpAQCAtOTExMyw3ICs5NDQ5LDcgQEAKIAkgICAgLyoKIAkgICAgKiBTZWFyY2ggZm9yIGEgbWFwcGluZy4KIAkgICAgKi8KLQkgICAgWE1MX05TTUFQX0ZPUkVBQ0gobnNNYXAsIG1pKSB7CSAgICAKKwkgICAgWE1MX05TTUFQX0ZPUkVBQ0gobnNNYXAsIG1pKSB7CiAJCWlmICgobWktPnNoYWRvd0RlcHRoID09IC0xKSAmJgogCQkgICAgKGN1ci0+bnMgPT0gbWktPm9sZE5zKSkgewogCQkgICAgLyoKQEAgLTkxNDUsNyArOTQ4MSw3IEBACiAJICAgICogQXF1aXJlIGEgbm9ybWFsaXplZCBucy1kZWNsIGFuZCBhZGQgaXQgdG8gdGhlIG1hcC4KIAkgICAgKi8KIAkgICAgaWYgKHhtbERPTVdyYXBOU05vcm1BcXVpcmVOb3JtYWxpemVkTnMoZGVzdERvYywKLQkJLyogbnMtZGVjbHMgb24gY3VyRWxlbSBvciBvbiBkZXN0RG9jLT5vbGROcyAqLwkJCQorCQkvKiBucy1kZWNscyBvbiBjdXJFbGVtIG9yIG9uIGRlc3REb2MtPm9sZE5zICovCiAJCWRlc3RQYXJlbnQgPyBjdXJFbGVtIDogTlVMTCwKIAkJY3VyLT5ucywgJm5zLAogCQkmbnNNYXAsIGRlcHRoLApAQCAtOTE2OCw5ICs5NTA0LDkgQEAKIAkgICAgKGNsb25lLT5wYXJlbnQgIT0gTlVMTCkpCiAJewogCSAgICBpZiAoeG1sSXNJRChkZXN0RG9jLCBjbG9uZS0+cGFyZW50LCAoeG1sQXR0clB0cikgY2xvbmUpKSB7Ci0JICAgCisKIAkJeG1sQ2hhciAqaWRWYWw7Ci0JCQorCiAJCWlkVmFsID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoY3VyLT5kb2MsIGN1ci0+Y2hpbGRyZW4sIDEpOwogCQlpZiAoaWRWYWwgIT0gTlVMTCkgewogCQkgICAgaWYgKHhtbEFkZElEKE5VTEwsIGRlc3REb2MsIGlkVmFsLCAoeG1sQXR0clB0cikgY3VyKSA9PSBOVUxMKSB7CkBAIC05MTg2LDEyICs5NTIyLDEyIEBACiAJKioKIAkqKiBUaGUgZm9sbG93aW5nIHdpbGwgdHJhdmVyc2UgdGhlIHRyZWUgKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkqKgotCSoJCisJKgogCSogV2FsayB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgYmVmb3JlIGRlc2NlbmRpbmcgaW50byBjaGlsZC1ub2Rlcy4KIAkqLwogCWlmICgoY3VyLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmIChjdXItPnByb3BlcnRpZXMgIT0gTlVMTCkpIHsKIAkgICAgcHJldkNsb25lID0gTlVMTDsKLQkgICAgcGFyZW50Q2xvbmUgPSBjbG9uZTsJICAgIAorCSAgICBwYXJlbnRDbG9uZSA9IGNsb25lOwogCSAgICBjdXIgPSAoeG1sTm9kZVB0cikgY3VyLT5wcm9wZXJ0aWVzOwogCSAgICBjb250aW51ZTsKIAl9CkBAIC05MjIxLDE0ICs5NTU3LDE0IEBACiAJICAgIC8qCiAJICAgICogVE9ETzogRG8gd2UgZXhwZWN0IG5zRGVmcyBvbiBYTUxfWElOQ0xVREVfU1RBUlQ/CiAJICAgICovCi0JICAgIGlmIChYTUxfTlNNQVBfTk9URU1QVFkobnNNYXApKSB7CSAgICAKKwkgICAgaWYgKFhNTF9OU01BUF9OT1RFTVBUWShuc01hcCkpIHsKIAkJLyoKIAkJKiBQb3AgbWFwcGluZ3MuCiAJCSovCiAJCXdoaWxlICgobnNNYXAtPmxhc3QgIT0gTlVMTCkgJiYKIAkJICAgIChuc01hcC0+bGFzdC0+ZGVwdGggPj0gZGVwdGgpKQogCQl7Ci0JCSAgICBYTUxfTlNNQVBfUE9QKG5zTWFwLCBtaSkJCSAgICAKKwkJICAgIFhNTF9OU01BUF9QT1AobnNNYXAsIG1pKQogCQl9CiAJCS8qCiAJCSogVW5zaGFkb3cuCkBAIC05MjM3LDcgKzk1NzMsNyBAQAogCQkgICAgaWYgKG1pLT5zaGFkb3dEZXB0aCA+PSBkZXB0aCkKIAkJCW1pLT5zaGFkb3dEZXB0aCA9IC0xOwogCQl9Ci0JICAgIH0JICAgIAorCSAgICB9CiAJICAgIGRlcHRoLS07CiAJfQogCWlmIChjdXItPm5leHQgIT0gTlVMTCkgewpAQCAtOTI1MCw3ICs5NTg2LDcgQEAKIAkgICAgaWYgKGNsb25lLT5wYXJlbnQgIT0gTlVMTCkKIAkJY2xvbmUtPnBhcmVudC0+bGFzdCA9IGNsb25lOwogCSAgICBjbG9uZSA9IGNsb25lLT5wYXJlbnQ7Ci0JICAgIHBhcmVudENsb25lID0gY2xvbmUtPnBhcmVudDsgCisJICAgIHBhcmVudENsb25lID0gY2xvbmUtPnBhcmVudDsKIAkgICAgLyoKIAkgICAgKiBQcm9jZXNzIHBhcmVudCAtLT4gbmV4dDsKIAkgICAgKi8KQEAgLTkyNTksMTQgKzk1OTUsMTQgQEAKIAl9IGVsc2UgewogCSAgICAvKiBUaGlzIGlzIGZvciBhdHRyaWJ1dGVzIG9ubHkuICovCiAJICAgIGNsb25lID0gY2xvbmUtPnBhcmVudDsKLQkgICAgcGFyZW50Q2xvbmUgPSBjbG9uZS0+cGFyZW50OyAKKwkgICAgcGFyZW50Q2xvbmUgPSBjbG9uZS0+cGFyZW50OwogCSAgICAvKgogCSAgICAqIFByb2Nlc3MgcGFyZW50LWVsZW1lbnQgLS0+IGNoaWxkcmVuLgogCSAgICAqLwogCSAgICBjdXIgPSBjdXItPnBhcmVudDsKLQkgICAgZ290byBpbnRvX2NvbnRlbnQ7CSAgICAKKwkgICAgZ290byBpbnRvX2NvbnRlbnQ7CiAJfQotICAgIH0gICAgICAgIAorICAgIH0KICAgICBnb3RvIGV4aXQ7CiAKIGludGVybmFsX2Vycm9yOgpAQCAtOTI4Nyw3ICs5NjIzLDcgQEAKIAkJbnNNYXAtPnBvb2wgPSBuc01hcC0+Zmlyc3Q7CiAJCW5zTWFwLT5maXJzdCA9IE5VTEw7CiAJICAgIH0KLQl9IGVsc2UgICAgCisJfSBlbHNlCiAJICAgIHhtbERPTVdyYXBOc01hcEZyZWUobnNNYXApOwogICAgIH0KICAgICAvKgpAQCAtOTMyNyw3ICs5NjYzLDcgQEAKIAogICAgIGlmICgoYXR0ciA9PSBOVUxMKSB8fCAoZGVzdERvYyA9PSBOVUxMKSkKIAlyZXR1cm4gKC0xKTsKLSAgICAKKwogICAgIGF0dHItPmRvYyA9IGRlc3REb2M7CiAgICAgaWYgKGF0dHItPm5zICE9IE5VTEwpIHsKIAl4bWxOc1B0ciBucyA9IE5VTEw7CkBAIC05MzU0LDEzICs5NjkwLDEzIEBACiAJCW5zID0geG1sRE9NV3JhcE5TTm9ybURlY2xhcmVOc0ZvcmNlZChkZXN0RG9jLCBkZXN0UGFyZW50LAogCQkgICAgYXR0ci0+bnMtPmhyZWYsIGF0dHItPm5zLT5wcmVmaXgsIDEpOwogCSAgICB9Ci0JfQkgICAgCisJfQogCWlmIChucyA9PSBOVUxMKQogCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwogCWF0dHItPm5zID0gbnM7Ci0gICAgfSAgIAotICAgIAotICAgIFhNTF9UUkVFX0FET1BUX1NUUihhdHRyLT5uYW1lKTsgICAgCisgICAgfQorCisgICAgWE1MX1RSRUVfQURPUFRfU1RSKGF0dHItPm5hbWUpOwogICAgIGF0dHItPmF0eXBlID0gMDsKICAgICBhdHRyLT5wc3ZpID0gTlVMTDsKICAgICAvKgpAQCAtOTM3NSw3ICs5NzExLDcgQEAKIAkgICAgY2FzZSBYTUxfVEVYVF9OT0RFOgogCSAgICBjYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CiAJCVhNTF9UUkVFX0FET1BUX1NUUl8yKGN1ci0+Y29udGVudCkKLQkJYnJlYWs7CSAgIAorCQlicmVhazsKIAkgICAgY2FzZSBYTUxfRU5USVRZX1JFRl9OT0RFOgogCQkvKgogCQkqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGVudGl0aXR5LW5vZGUuCkBAIC05MzkzLDcgKzk3MjksNyBAQAogCQkJY3VyLT5jb250ZW50ID0gZW50LT5jb250ZW50OwogCQkJY3VyLT5jaGlsZHJlbiA9ICh4bWxOb2RlUHRyKSBlbnQ7CiAJCQljdXItPmxhc3QgPSAoeG1sTm9kZVB0cikgZW50OwotCQkgICAgfQkgICAgCSAgICAJCQorCQkgICAgfQogCQl9CiAJCWJyZWFrOwogCSAgICBkZWZhdWx0OgpAQCAtOTQzMSw4ICs5NzY3LDggQEAKICogMSkgSWYgQGRlc3RQYXJlbnQgaXMgZ2l2ZW4sIHRoZW4gbnNEZWYgZW50cmllcyBvbiBlbGVtZW50LW5vZGVzIGFyZSB1c2VkCiAqIDIpIElmICpubyogQGRlc3RQYXJlbnQgaXMgZ2l2ZW4sIHRoZW4gQGRlc3REb2MtPm9sZE5zIGVudHJpZXMgYXJlIHVzZWQKICogICAgVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHlvdSBoYXZlIGFuIHVubGlrZWQgbm9kZSBhbmQganVzdCB3YW50IHRvIG1vdmUgaXQKLSogICAgdG8gdGhlIGNvbnRleHQgb2YgCi0qIAorKiAgICB0byB0aGUgY29udGV4dCBvZgorKgogKiBJZiBAZGVzdFBhcmVudCBpcyBnaXZlbiwgaXQgZW5zdXJlcyB0aGF0IHRoZSB0cmVlIGlzIG5hbWVzcGFjZQogKiB3ZWxsZm9ybWVkIGJ5IGNyZWF0aW5nIGFkZGl0aW9uYWwgbnMtZGVjbHMgd2hlcmUgbmVlZGVkLgogKiBOb3RlIHRoYXQsIHNpbmNlIHByZWZpeGVzIG9mIGFscmVhZHkgZXhpc3RlbnQgbnMtZGVjbHMgY2FuIGJlCkBAIC05NDQ5LDcgKzk3ODUsNyBAQAogeG1sRE9NV3JhcEFkb3B0Tm9kZSh4bWxET01XcmFwQ3R4dFB0ciBjdHh0LAogCQkgICAgeG1sRG9jUHRyIHNvdXJjZURvYywKIAkJICAgIHhtbE5vZGVQdHIgbm9kZSwKLQkJICAgIHhtbERvY1B0ciBkZXN0RG9jLAkJICAgIAorCQkgICAgeG1sRG9jUHRyIGRlc3REb2MsCiAJCSAgICB4bWxOb2RlUHRyIGRlc3RQYXJlbnQsCiAJCSAgICBpbnQgb3B0aW9ucykKIHsKQEAgLTk0NTgsNyArOTc5NCw3IEBACiAJcmV0dXJuKC0xKTsKICAgICAvKgogICAgICogQ2hlY2sgbm9kZS0+ZG9jIHNhbml0eS4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIGlmICgobm9kZS0+ZG9jICE9IE5VTEwpICYmIChzb3VyY2VEb2MgIT0gTlVMTCkgJiYKIAkobm9kZS0+ZG9jICE9IHNvdXJjZURvYykpIHsKIAkvKgpAQCAtOTQ3MSw3ICs5ODA3LDcgQEAKICAgICBpZiAoc291cmNlRG9jID09IGRlc3REb2MpCiAJcmV0dXJuICgtMSk7CiAgICAgc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgkgICAgCisJY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgogCWNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgogCWNhc2UgWE1MX1RFWFRfTk9ERToKIAljYXNlIFhNTF9DREFUQV9TRUNUSU9OX05PREU6CkBAIC05NDk3LDcgKzk4MzMsNyBAQAogICAgIH0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpIHsKIAkgICAgcmV0dXJuICh4bWxET01XcmFwQWRvcHRBdHRyKGN0eHQsIHNvdXJjZURvYywKIAkJKHhtbEF0dHJQdHIpIG5vZGUsIGRlc3REb2MsIGRlc3RQYXJlbnQsIG9wdGlvbnMpKTsKLSAgICB9IGVsc2UgewkKKyAgICB9IGVsc2UgewogCXhtbE5vZGVQdHIgY3VyID0gbm9kZTsKIAlpbnQgYWRvcHRTdHIgPSAxOwogCkBAIC05NTA5LDcgKzk4NDUsNyBAQAogCSAgICAoc291cmNlRG9jLT5kaWN0ID09IGRlc3REb2MtPmRpY3QpKQogCQlhZG9wdFN0ciA9IDA7CiAJc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JICAgIGNhc2UgWE1MX1RFWFRfTk9ERToJICAgIAorCSAgICBjYXNlIFhNTF9URVhUX05PREU6CiAJICAgIGNhc2UgWE1MX0NEQVRBX1NFQ1RJT05fTk9ERToKIAkJWE1MX1RSRUVfQURPUFRfU1RSXzIobm9kZS0+Y29udGVudCkKIAkJICAgIGJyZWFrOwpAQCAtOTU0Miw3ICs5ODc4LDcgQEAKIAkgICAgZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotICAgIH0JCisgICAgfQogICAgIHJldHVybiAoMCk7CiB9CiAKZGlmZiAtLWdpdCBhL3VyaS5jIGIvdXJpLmMKaW5kZXggMzQ4NDFhZi4uMjg0MDFjOCAxMDA2NDQKLS0tIGEvdXJpLmMKKysrIGIvdXJpLmMKQEAgLTEsNyArMSw3IEBACiAvKioKICAqIHVyaS5jOiBzZXQgb2YgZ2VuZXJpYyBVUkkgcmVsYXRlZCByb3V0aW5lcyAKICAqCi0gKiBSZWZlcmVuY2U6IFJGQ3MgMjM5NiwgMjczMiBhbmQgMjM3MworICogUmVmZXJlbmNlOiBSRkNzIDM5ODYsIDI3MzIgYW5kIDIzNzMKICAqCiAgKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCiAgKgpAQCAtMTgsMTQgKzE4LDEwIEBACiAjaW5jbHVkZSA8bGlieG1sL2dsb2JhbHMuaD4KICNpbmNsdWRlIDxsaWJ4bWwveG1sZXJyb3IuaD4KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCQkJCQkqCi0gKgkJTWFjcm9zIHRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBjaGFyYWN0ZXIgdHlwZQkJKgotICoJCQlkaXJlY3RseSBleHRyYWN0ZWQgZnJvbSBSRkMgMjM5NgkJKgotICoJCQkJCQkJCQkqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgeG1sQ2xlYW5VUkkoeG1sVVJJUHRyIHVyaSk7CiAKIC8qCisgKiBPbGQgcnVsZSBmcm9tIDIzOTYgdXNlZCBpbiBsZWdhY3kgaGFuZGxpbmcgY29kZQogICogYWxwaGEgICAgPSBsb3dhbHBoYSB8IHVwYWxwaGEKICAqLwogI2RlZmluZSBJU19BTFBIQSh4KSAoSVNfTE9XQUxQSEEoeCkgfHwgSVNfVVBBTFBIQSh4KSkKQEAgLTYxLDMxICs1NywzMCBAQAogI2RlZmluZSBJU19BTFBIQU5VTSh4KSAoSVNfQUxQSEEoeCkgfHwgSVNfRElHSVQoeCkpCiAKIC8qCi0gKiBoZXggPSBkaWdpdCB8ICJBIiB8ICJCIiB8ICJDIiB8ICJEIiB8ICJFIiB8ICJGIiB8Ci0gKiAgICAgICAgICAgICAgICJhIiB8ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJmIgotICovCi0KLSNkZWZpbmUgSVNfSEVYKHgpICgoSVNfRElHSVQoeCkpIHx8ICgoKHgpID49ICdhJykgJiYgKCh4KSA8PSAnZicpKSB8fCBcCi0JICAgICgoKHgpID49ICdBJykgJiYgKCh4KSA8PSAnRicpKSkKLQotLyoKICAqIG1hcmsgPSAiLSIgfCAiXyIgfCAiLiIgfCAiISIgfCAifiIgfCAiKiIgfCAiJyIgfCAiKCIgfCAiKSIKICAqLwogCi0jZGVmaW5lIElTX01BUksoeCkgKCgoeCkgPT0gJy0nKSB8fCAoKHgpID09ICdfJykgfHwgKCh4KSA9PSAnLicpIHx8CVwKLSAgICAoKHgpID09ICchJykgfHwgKCh4KSA9PSAnficpIHx8ICgoeCkgPT0gJyonKSB8fCAoKHgpID09ICdcJycpIHx8CVwKKyNkZWZpbmUgSVNfTUFSSyh4KSAoKCh4KSA9PSAnLScpIHx8ICgoeCkgPT0gJ18nKSB8fCAoKHgpID09ICcuJykgfHwgICAgIFwKKyAgICAoKHgpID09ICchJykgfHwgKCh4KSA9PSAnficpIHx8ICgoeCkgPT0gJyonKSB8fCAoKHgpID09ICdcJycpIHx8ICAgIFwKICAgICAoKHgpID09ICcoJykgfHwgKCh4KSA9PSAnKScpKQogCi0KIC8qCi0gKiByZXNlcnZlZCA9ICI7IiB8ICIvIiB8ICI/IiB8ICI6IiB8ICJAIiB8ICImIiB8ICI9IiB8ICIrIiB8ICIkIiB8ICIsIiB8Ci0gKiAJICAgICAgIlsiIHwgIl0iCisgKiB1bndpc2UgPSAieyIgfCAifSIgfCAifCIgfCAiXCIgfCAiXiIgfCAiYCIKICAqLwogCi0jZGVmaW5lIElTX1JFU0VSVkVEKHgpICgoKHgpID09ICc7JykgfHwgKCh4KSA9PSAnLycpIHx8ICgoeCkgPT0gJz8nKSB8fAlcCi0gICAgICAgICgoeCkgPT0gJzonKSB8fCAoKHgpID09ICdAJykgfHwgKCh4KSA9PSAnJicpIHx8ICgoeCkgPT0gJz0nKSB8fAlcCi0JKCh4KSA9PSAnKycpIHx8ICgoeCkgPT0gJyQnKSB8fCAoKHgpID09ICcsJykgfHwgKCh4KSA9PSAnWycpIHx8IFwKLQkoKHgpID09ICddJykpCisjZGVmaW5lIElTX1VOV0lTRShwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKCgqKHApID09ICd7JykpIHx8ICgoKihwKSA9PSAnfScpKSB8fCAoKCoocCkgPT0gJ3wnKSkgfHwgICAgICAgICBcCisgICAgICAgKCgqKHApID09ICdcXCcpKSB8fCAoKCoocCkgPT0gJ14nKSkgfHwgKCgqKHApID09ICdbJykpIHx8ICAgICAgICBcCisgICAgICAgKCgqKHApID09ICddJykpIHx8ICgoKihwKSA9PSAnYCcpKSkKKy8qCisgKiByZXNlcnZlZCA9ICI7IiB8ICIvIiB8ICI/IiB8ICI6IiB8ICJAIiB8ICImIiB8ICI9IiB8ICIrIiB8ICIkIiB8ICIsIiB8CisgKiAgICAgICAgICAgICJbIiB8ICJdIgorICovCisKKyNkZWZpbmUgSVNfUkVTRVJWRUQoeCkgKCgoeCkgPT0gJzsnKSB8fCAoKHgpID09ICcvJykgfHwgKCh4KSA9PSAnPycpIHx8IFwKKyAgICAgICAgKCh4KSA9PSAnOicpIHx8ICgoeCkgPT0gJ0AnKSB8fCAoKHgpID09ICcmJykgfHwgKCh4KSA9PSAnPScpIHx8IFwKKyAgICAgICAgKCh4KSA9PSAnKycpIHx8ICgoeCkgPT0gJyQnKSB8fCAoKHgpID09ICcsJykgfHwgKCh4KSA9PSAnWycpIHx8IFwKKyAgICAgICAgKCh4KSA9PSAnXScpKQogCiAvKgogICogdW5yZXNlcnZlZCA9IGFscGhhbnVtIHwgbWFyawpAQCAtOTQsODIgKzg5LDYgQEAKICNkZWZpbmUgSVNfVU5SRVNFUlZFRCh4KSAoSVNfQUxQSEFOVU0oeCkgfHwgSVNfTUFSSyh4KSkKIAogLyoKLSAqIGVzY2FwZWQgPSAiJSIgaGV4IGhleAotICovCi0KLSNkZWZpbmUgSVNfRVNDQVBFRChwKSAoKCoocCkgPT0gJyUnKSAmJiAoSVNfSEVYKChwKVsxXSkpICYmCQlcCi0JICAgIChJU19IRVgoKHApWzJdKSkpCi0KLS8qCi0gKiB1cmljX25vX3NsYXNoID0gdW5yZXNlcnZlZCB8IGVzY2FwZWQgfCAiOyIgfCAiPyIgfCAiOiIgfCAiQCIgfAotICogICAgICAgICAgICAgICAgICAgICAgICAiJiIgfCAiPSIgfCAiKyIgfCAiJCIgfCAiLCIKLSAqLwotI2RlZmluZSBJU19VUklDX05PX1NMQVNIKHApICgoSVNfVU5SRVNFUlZFRCgqKHApKSkgfHwgKElTX0VTQ0FQRUQocCkpIHx8XAotCSAgICAgICAgKCgqKHApID09ICc7JykpIHx8ICgoKihwKSA9PSAnPycpKSB8fCAoKCoocCkgPT0gJzonKSkgfHxcCi0JICAgICAgICAoKCoocCkgPT0gJ0AnKSkgfHwgKCgqKHApID09ICcmJykpIHx8ICgoKihwKSA9PSAnPScpKSB8fFwKLQkgICAgICAgICgoKihwKSA9PSAnKycpKSB8fCAoKCoocCkgPT0gJyQnKSkgfHwgKCgqKHApID09ICcsJykpKQotCi0vKgotICogcGNoYXIgPSB1bnJlc2VydmVkIHwgZXNjYXBlZCB8ICI6IiB8ICJAIiB8ICImIiB8ICI9IiB8ICIrIiB8ICIkIiB8ICIsIgotICovCi0jZGVmaW5lIElTX1BDSEFSKHApICgoSVNfVU5SRVNFUlZFRCgqKHApKSkgfHwgKElTX0VTQ0FQRUQocCkpIHx8CVwKLQkgICAgICAgICgoKihwKSA9PSAnOicpKSB8fCAoKCoocCkgPT0gJ0AnKSkgfHwgKCgqKHApID09ICcmJykpIHx8XAotCSAgICAgICAgKCgqKHApID09ICc9JykpIHx8ICgoKihwKSA9PSAnKycpKSB8fCAoKCoocCkgPT0gJyQnKSkgfHxcCi0JICAgICAgICAoKCoocCkgPT0gJywnKSkpCi0KLS8qCi0gKiByZWxfc2VnbWVudCAgID0gMSooIHVucmVzZXJ2ZWQgfCBlc2NhcGVkIHwKLSAqICAgICAgICAgICAgICAgICAiOyIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgfCAiJCIgfCAiLCIgKQotICovCi0KLSNkZWZpbmUgSVNfU0VHTUVOVChwKSAoKElTX1VOUkVTRVJWRUQoKihwKSkpIHx8IChJU19FU0NBUEVEKHApKSB8fAlcCi0gICAgICAgICAgKCgqKHApID09ICc7JykpIHx8ICgoKihwKSA9PSAnQCcpKSB8fCAoKCoocCkgPT0gJyYnKSkgfHwJXAotCSAgKCgqKHApID09ICc9JykpIHx8ICgoKihwKSA9PSAnKycpKSB8fCAoKCoocCkgPT0gJyQnKSkgfHwJXAotCSAgKCgqKHApID09ICcsJykpKQotCi0vKgotICogc2NoZW1lID0gYWxwaGEgKiggYWxwaGEgfCBkaWdpdCB8ICIrIiB8ICItIiB8ICIuIiApCi0gKi8KLQotI2RlZmluZSBJU19TQ0hFTUUoeCkgKChJU19BTFBIQSh4KSkgfHwgKElTX0RJR0lUKHgpKSB8fAkJCVwKLQkgICAgICAgICAgICAgICgoeCkgPT0gJysnKSB8fCAoKHgpID09ICctJykgfHwgKCh4KSA9PSAnLicpKQotCi0vKgotICogcmVnX25hbWUgPSAxKiggdW5yZXNlcnZlZCB8IGVzY2FwZWQgfCAiJCIgfCAiLCIgfAotICogICAgICAgICAgICAgICAgIjsiIHwgIjoiIHwgIkAiIHwgIiYiIHwgIj0iIHwgIisiICkKLSAqLwotCi0jZGVmaW5lIElTX1JFR19OQU1FKHApICgoSVNfVU5SRVNFUlZFRCgqKHApKSkgfHwgKElTX0VTQ0FQRUQocCkpIHx8CVwKLSAgICAgICAoKCoocCkgPT0gJyQnKSkgfHwgKCgqKHApID09ICcsJykpIHx8ICgoKihwKSA9PSAnOycpKSB8fAkJXAotICAgICAgICgoKihwKSA9PSAnOicpKSB8fCAoKCoocCkgPT0gJ0AnKSkgfHwgKCgqKHApID09ICcmJykpIHx8CQlcCi0gICAgICAgKCgqKHApID09ICc9JykpIHx8ICgoKihwKSA9PSAnKycpKSkKLQotLyoKLSAqIHVzZXJpbmZvID0gKiggdW5yZXNlcnZlZCB8IGVzY2FwZWQgfCAiOyIgfCAiOiIgfCAiJiIgfCAiPSIgfAotICogICAgICAgICAgICAgICAgICAgICAgIisiIHwgIiQiIHwgIiwiICkKLSAqLwotI2RlZmluZSBJU19VU0VSSU5GTyhwKSAoKElTX1VOUkVTRVJWRUQoKihwKSkpIHx8IChJU19FU0NBUEVEKHApKSB8fAlcCi0gICAgICAgKCgqKHApID09ICc7JykpIHx8ICgoKihwKSA9PSAnOicpKSB8fCAoKCoocCkgPT0gJyYnKSkgfHwJCVwKLSAgICAgICAoKCoocCkgPT0gJz0nKSkgfHwgKCgqKHApID09ICcrJykpIHx8ICgoKihwKSA9PSAnJCcpKSB8fAkJXAotICAgICAgICgoKihwKSA9PSAnLCcpKSkKLQotLyoKLSAqIHVyaWMgPSByZXNlcnZlZCB8IHVucmVzZXJ2ZWQgfCBlc2NhcGVkCi0gKi8KLQotI2RlZmluZSBJU19VUklDKHApICgoSVNfVU5SRVNFUlZFRCgqKHApKSkgfHwgKElTX0VTQ0FQRUQocCkpIHx8CQlcCi0JICAgICAgICAgICAgKElTX1JFU0VSVkVEKCoocCkpKSkKLQotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogdW53aXNlID0gInsiIHwgIn0iIHwgInwiIHwgIlwiIHwgIl4iIHwgImAiCi0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSNkZWZpbmUgSVNfVU5XSVNFKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICgoKCoocCkgPT0gJ3snKSkgfHwgKCgqKHApID09ICd9JykpIHx8ICgoKihwKSA9PSAnfCcpKSB8fCAgICAgICAgIFwKLSAgICAgICAoKCoocCkgPT0gJ1xcJykpIHx8ICgoKihwKSA9PSAnXicpKSB8fCAoKCoocCkgPT0gJ1snKSkgfHwgICAgICAgIFwKLSAgICAgICAoKCoocCkgPT0gJ10nKSkgfHwgKCgqKHApID09ICdgJykpKSAgCi0KLS8qCiAgKiBTa2lwIHRvIG5leHQgcG9pbnRlciBjaGFyLCBoYW5kbGUgZXNjYXBlZCBzZXF1ZW5jZXMKICAqLwogCkBAIC0xODksNiArMTA4LDg0NSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAzOTg2IHBhcnNlcgkJCQkqCisgKgkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVNBX0RJR0lUKHApICgoKihwKSA+PSAnMCcpICYmICgqKHApIDw9ICc5JykpCisjZGVmaW5lIElTQV9BTFBIQShwKSAoKCgqKHApID49ICdhJykgJiYgKCoocCkgPD0gJ3onKSkgfHwJCVwKKyAgICAgICAgICAgICAgICAgICAgICAoKCoocCkgPj0gJ0EnKSAmJiAoKihwKSA8PSAnWicpKSkKKyNkZWZpbmUgSVNBX0hFWERJRyhwKQkJCQkJCQlcCisgICAgICAgKElTQV9ESUdJVChwKSB8fCAoKCoocCkgPj0gJ2EnKSAmJiAoKihwKSA8PSAnZicpKSB8fAkJXAorICAgICAgICAoKCoocCkgPj0gJ0EnKSAmJiAoKihwKSA8PSAnRicpKSkKKworLyoKKyAqICAgIHN1Yi1kZWxpbXMgICAgPSAiISIgLyAiJCIgLyAiJiIgLyAiJyIgLyAiKCIgLyAiKSIKKyAqICAgICAgICAgICAgICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSIKKyAqLworI2RlZmluZSBJU0FfU1VCX0RFTElNKHApCQkJCQkJXAorICAgICAgKCgoKihwKSA9PSAnIScpKSB8fCAoKCoocCkgPT0gJyQnKSkgfHwgKCgqKHApID09ICcmJykpIHx8CQlcCisgICAgICAgKCgqKHApID09ICcoJykpIHx8ICgoKihwKSA9PSAnKScpKSB8fCAoKCoocCkgPT0gJyonKSkgfHwJCVwKKyAgICAgICAoKCoocCkgPT0gJysnKSkgfHwgKCgqKHApID09ICcsJykpIHx8ICgoKihwKSA9PSAnOycpKSB8fAkJXAorICAgICAgICgoKihwKSA9PSAnPScpKSkKKworLyoKKyAqICAgIGdlbi1kZWxpbXMgICAgPSAiOiIgLyAiLyIgLyAiPyIgLyAiIyIgLyAiWyIgLyAiXSIgLyAiQCIKKyAqLworI2RlZmluZSBJU0FfR0VOX0RFTElNKHApCQkJCQkJXAorICAgICAgKCgoKihwKSA9PSAnOicpKSB8fCAoKCoocCkgPT0gJy8nKSkgfHwgKCgqKHApID09ICc/JykpIHx8ICAgICAgICAgXAorICAgICAgICgoKihwKSA9PSAnIycpKSB8fCAoKCoocCkgPT0gJ1snKSkgfHwgKCgqKHApID09ICddJykpIHx8ICAgICAgICAgXAorICAgICAgICgoKihwKSA9PSAnQCcpKSkKKworLyoKKyAqICAgIHJlc2VydmVkICAgICAgPSBnZW4tZGVsaW1zIC8gc3ViLWRlbGltcworICovCisjZGVmaW5lIElTQV9SRVNFUlZFRChwKSAoSVNBX0dFTl9ERUxJTShwKSB8fCAoSVNBX1NVQl9ERUxJTShwKSkpCisKKy8qCisgKiAgICB1bnJlc2VydmVkICAgID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgorICovCisjZGVmaW5lIElTQV9VTlJFU0VSVkVEKHApCQkJCQkJXAorICAgICAgKChJU0FfQUxQSEEocCkpIHx8IChJU0FfRElHSVQocCkpIHx8ICgoKihwKSA9PSAnLScpKSB8fAkJXAorICAgICAgICgoKihwKSA9PSAnLicpKSB8fCAoKCoocCkgPT0gJ18nKSkgfHwgKCgqKHApID09ICd+JykpKQorCisvKgorICogICAgcGN0LWVuY29kZWQgICA9ICIlIiBIRVhESUcgSEVYRElHCisgKi8KKyNkZWZpbmUgSVNBX1BDVF9FTkNPREVEKHApCQkJCQkJXAorICAgICAoKCoocCkgPT0gJyUnKSAmJiAoSVNBX0hFWERJRyhwICsgMSkpICYmIChJU0FfSEVYRElHKHAgKyAyKSkpCisKKy8qCisgKiAgICBwY2hhciAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgorICovCisjZGVmaW5lIElTQV9QQ0hBUihwKQkJCQkJCQlcCisgICAgIChJU0FfVU5SRVNFUlZFRChwKSB8fCBJU0FfUENUX0VOQ09ERUQocCkgfHwgSVNBX1NVQl9ERUxJTShwKSB8fAlcCisgICAgICAoKCoocCkgPT0gJzonKSkgfHwgKCgqKHApID09ICdAJykpKQorCisvKioKKyAqIHhtbFBhcnNlMzk4NlNjaGVtZToKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIGFuIFVSSSBzY2hlbWUKKyAqCisgKiBBTFBIQSAqKCBBTFBIQSAvIERJR0lUIC8gIisiIC8gIi0iIC8gIi4iICkKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2U2NoZW1lKHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpIHsKKyAgICBjb25zdCBjaGFyICpjdXI7CisKKyAgICBpZiAoc3RyID09IE5VTEwpCisJcmV0dXJuKC0xKTsKKworICAgIGN1ciA9ICpzdHI7CisgICAgaWYgKCFJU0FfQUxQSEEoY3VyKSkKKwlyZXR1cm4oMik7CisgICAgY3VyKys7CisgICAgd2hpbGUgKElTQV9BTFBIQShjdXIpIHx8IElTQV9ESUdJVChjdXIpIHx8CisgICAgICAgICAgICgqY3VyID09ICcrJykgfHwgKCpjdXIgPT0gJy0nKSB8fCAoKmN1ciA9PSAnLicpKSBjdXIrKzsKKyAgICBpZiAodXJpICE9IE5VTEwpIHsKKwlpZiAodXJpLT5zY2hlbWUgIT0gTlVMTCkgeG1sRnJlZSh1cmktPnNjaGVtZSk7CisJdXJpLT5zY2hlbWUgPSBTVFJORFVQKCpzdHIsIGN1ciAtICpzdHIpOworICAgIH0KKyAgICAqc3RyID0gY3VyOworICAgIHJldHVybigwKTsKK30KKworLyoqCisgKiB4bWxQYXJzZTM5ODZGcmFnbWVudDoKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIHRoZSBxdWVyeSBwYXJ0IG9mIGFuIFVSSQorICoKKyAqIGZyYWdtZW50ICAgICAgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCisgKiBOT1RFOiB0aGUgc3RyaWN0IHN5bnRheCBhcyBkZWZpbmVkIGJ5IDM5ODYgZG9lcyBub3QgYWxsb3cgJ1snIGFuZCAnXScKKyAqICAgICAgIGluIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGJ1dCB0aGlzIGlzIHVzZWQgdmVyeSBicm9hZGx5IGZvcgorICogICAgICAgeHBvaW50ZXIgc2NoZW1lIHNlbGVjdGlvbiwgc28gd2UgYXJlIGFsbG93aW5nIGl0IGhlcmUgdG8gbm90IGJyZWFrCisgKiAgICAgICBmb3IgZXhhbXBsZSBhbGwgdGhlIERvY0Jvb2sgcHJvY2Vzc2luZyBjaGFpbnMuCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NkZyYWdtZW50KHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpCit7CisgICAgY29uc3QgY2hhciAqY3VyOworCisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKC0xKTsKKworICAgIGN1ciA9ICpzdHI7CisKKyAgICB3aGlsZSAoKElTQV9QQ0hBUihjdXIpKSB8fCAoKmN1ciA9PSAnLycpIHx8ICgqY3VyID09ICc/JykgfHwKKyAgICAgICAgICAgKCpjdXIgPT0gJ1snKSB8fCAoKmN1ciA9PSAnXScpIHx8CisgICAgICAgICAgICgodXJpICE9IE5VTEwpICYmICh1cmktPmNsZWFudXAgJiAxKSAmJiAoSVNfVU5XSVNFKGN1cikpKSkKKyAgICAgICAgTkVYVChjdXIpOworICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBpZiAodXJpLT5mcmFnbWVudCAhPSBOVUxMKQorICAgICAgICAgICAgeG1sRnJlZSh1cmktPmZyYWdtZW50KTsKKwlpZiAodXJpLT5jbGVhbnVwICYgMikKKwkgICAgdXJpLT5mcmFnbWVudCA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7CisJZWxzZQorCSAgICB1cmktPmZyYWdtZW50ID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7CisgICAgfQorICAgICpzdHIgPSBjdXI7CisgICAgcmV0dXJuICgwKTsKK30KKworLyoqCisgKiB4bWxQYXJzZTM5ODZRdWVyeToKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIHRoZSBxdWVyeSBwYXJ0IG9mIGFuIFVSSQorICoKKyAqIHF1ZXJ5ID0gKnVyaWMKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2UXVlcnkoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiAoLTEpOworCisgICAgY3VyID0gKnN0cjsKKworICAgIHdoaWxlICgoSVNBX1BDSEFSKGN1cikpIHx8ICgqY3VyID09ICcvJykgfHwgKCpjdXIgPT0gJz8nKSB8fAorICAgICAgICAgICAoKHVyaSAhPSBOVUxMKSAmJiAodXJpLT5jbGVhbnVwICYgMSkgJiYgKElTX1VOV0lTRShjdXIpKSkpCisgICAgICAgIE5FWFQoY3VyKTsKKyAgICBpZiAodXJpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHVyaS0+cXVlcnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHhtbEZyZWUodXJpLT5xdWVyeSk7CisJaWYgKHVyaS0+Y2xlYW51cCAmIDIpCisJICAgIHVyaS0+cXVlcnkgPSBTVFJORFVQKCpzdHIsIGN1ciAtICpzdHIpOworCWVsc2UKKwkgICAgdXJpLT5xdWVyeSA9IHhtbFVSSVVuZXNjYXBlU3RyaW5nKCpzdHIsIGN1ciAtICpzdHIsIE5VTEwpOworCisJLyogU2F2ZSB0aGUgcmF3IGJ5dGVzIG9mIHRoZSBxdWVyeSBhcyB3ZWxsLgorCSAqIFNlZTogaHR0cDovL21haWwuZ25vbWUub3JnL2FyY2hpdmVzL3htbC8yMDA3LUFwcmlsL3RocmVhZC5odG1sIzAwMTE0CisJICovCisJaWYgKHVyaS0+cXVlcnlfcmF3ICE9IE5VTEwpCisJICAgIHhtbEZyZWUgKHVyaS0+cXVlcnlfcmF3KTsKKwl1cmktPnF1ZXJ5X3JhdyA9IFNUUk5EVVAgKCpzdHIsIGN1ciAtICpzdHIpOworICAgIH0KKyAgICAqc3RyID0gY3VyOworICAgIHJldHVybiAoMCk7Cit9CisKKy8qKgorICogeG1sUGFyc2UzOTg2UG9ydDoKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqCisgKiBQYXJzZSBhIHBvcnQgIHBhcnQgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKKyAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQorICoKKyAqIHBvcnQgICAgICAgICAgPSAqRElHSVQKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2UG9ydCh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKmN1ciA9ICpzdHI7CisKKyAgICBpZiAoSVNBX0RJR0lUKGN1cikpIHsKKwlpZiAodXJpICE9IE5VTEwpCisJICAgIHVyaS0+cG9ydCA9IDA7CisJd2hpbGUgKElTQV9ESUdJVChjdXIpKSB7CisJICAgIGlmICh1cmkgIT0gTlVMTCkKKwkJdXJpLT5wb3J0ID0gdXJpLT5wb3J0ICogMTAgKyAoKmN1ciAtICcwJyk7CisJICAgIGN1cisrOworCX0KKwkqc3RyID0gY3VyOworCXJldHVybigwKTsKKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorCisvKioKKyAqIHhtbFBhcnNlMzk4NlVzZXJpbmZvOgorICogQHVyaTogIHBvaW50ZXIgdG8gYW4gVVJJIHN0cnVjdHVyZQorICogQHN0cjogIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIGFuIHVzZXIgaW5mb3JtYXRpb25zIHBhcnQgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKKyAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQorICoKKyAqIHVzZXJpbmZvICAgICAgPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiICkKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2VXNlcmluZm8oeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisKKyAgICBjdXIgPSAqc3RyOworICAgIHdoaWxlIChJU0FfVU5SRVNFUlZFRChjdXIpIHx8IElTQV9QQ1RfRU5DT0RFRChjdXIpIHx8CisgICAgICAgICAgIElTQV9TVUJfREVMSU0oY3VyKSB8fCAoKmN1ciA9PSAnOicpKQorCU5FWFQoY3VyKTsKKyAgICBpZiAoKmN1ciA9PSAnQCcpIHsKKwlpZiAodXJpICE9IE5VTEwpIHsKKwkgICAgaWYgKHVyaS0+dXNlciAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+dXNlcik7CisJICAgIGlmICh1cmktPmNsZWFudXAgJiAyKQorCQl1cmktPnVzZXIgPSBTVFJORFVQKCpzdHIsIGN1ciAtICpzdHIpOworCSAgICBlbHNlCisJCXVyaS0+dXNlciA9IHhtbFVSSVVuZXNjYXBlU3RyaW5nKCpzdHIsIGN1ciAtICpzdHIsIE5VTEwpOworCX0KKwkqc3RyID0gY3VyOworCXJldHVybigwKTsKKyAgICB9CisgICAgcmV0dXJuKDEpOworfQorCisvKioKKyAqIHhtbFBhcnNlMzk4NkRlY09jdGV0OgorICogQHN0cjogIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqICAgIGRlYy1vY3RldCAgICAgPSBESUdJVCAgICAgICAgICAgICAgICAgOyAwLTkKKyAqICAgICAgICAgICAgICAgICAgLyAleDMxLTM5IERJR0lUICAgICAgICAgOyAxMC05OQorICogICAgICAgICAgICAgICAgICAvICIxIiAyRElHSVQgICAgICAgICAgICA7IDEwMC0xOTkKKyAqICAgICAgICAgICAgICAgICAgLyAiMiIgJXgzMC0zNCBESUdJVCAgICAgOyAyMDAtMjQ5CisgKiAgICAgICAgICAgICAgICAgIC8gIjI1IiAleDMwLTM1ICAgICAgICAgIDsgMjUwLTI1NQorICoKKyAqIFNraXAgYSBkZWMtb2N0ZXQuCisgKgorICogUmV0dXJucyAwIGlmIGZvdW5kIGFuZCBza2lwcGVkLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZTM5ODZEZWNPY3RldChjb25zdCBjaGFyICoqc3RyKSB7CisgICAgY29uc3QgY2hhciAqY3VyID0gKnN0cjsKKworICAgIGlmICghKElTQV9ESUdJVChjdXIpKSkKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGlmICghSVNBX0RJR0lUKGN1cisxKSkKKwljdXIrKzsKKyAgICBlbHNlIGlmICgoKmN1ciAhPSAnMCcpICYmIChJU0FfRElHSVQoY3VyICsgMSkpICYmICghSVNBX0RJR0lUKGN1cisyKSkpCisJY3VyICs9IDI7CisgICAgZWxzZSBpZiAoKCpjdXIgPT0gJzEnKSAmJiAoSVNBX0RJR0lUKGN1ciArIDEpKSAmJiAoSVNBX0RJR0lUKGN1ciArIDIpKSkKKwljdXIgKz0gMzsKKyAgICBlbHNlIGlmICgoKmN1ciA9PSAnMicpICYmICgqKGN1ciArIDEpID49ICcwJykgJiYKKwkgICAgICgqKGN1ciArIDEpIDw9ICc0JykgJiYgKElTQV9ESUdJVChjdXIgKyAyKSkpCisJY3VyICs9IDM7CisgICAgZWxzZSBpZiAoKCpjdXIgPT0gJzInKSAmJiAoKihjdXIgKyAxKSA9PSAnNScpICYmCisJICAgICAoKihjdXIgKyAyKSA+PSAnMCcpICYmICgqKGN1ciArIDEpIDw9ICc1JykpCisJY3VyICs9IDM7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oMSk7CisgICAgKnN0ciA9IGN1cjsKKyAgICByZXR1cm4oMCk7Cit9CisvKioKKyAqIHhtbFBhcnNlMzk4Nkhvc3Q6CisgKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCisgKiBAc3RyOiAgdGhlIHN0cmluZyB0byBhbmFseXplCisgKgorICogUGFyc2UgYW4gaG9zdCBwYXJ0IGFuZCBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzCisgKiBvZiB0aGUgQHVyaSBzdHJ1Y3R1cmUKKyAqCisgKiBob3N0ICAgICAgICAgID0gSVAtbGl0ZXJhbCAvIElQdjRhZGRyZXNzIC8gcmVnLW5hbWUKKyAqIElQLWxpdGVyYWwgICAgPSAiWyIgKCBJUHY2YWRkcmVzcyAvIElQdkZ1dHVyZSAgKSAiXSIKKyAqIElQdjRhZGRyZXNzICAgPSBkZWMtb2N0ZXQgIi4iIGRlYy1vY3RldCAiLiIgZGVjLW9jdGV0ICIuIiBkZWMtb2N0ZXQKKyAqIHJlZy1uYW1lICAgICAgPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zICkKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2SG9zdCh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKmN1ciA9ICpzdHI7CisgICAgY29uc3QgY2hhciAqaG9zdDsKKworICAgIGhvc3QgPSBjdXI7CisgICAgLyoKKyAgICAgKiBJUHY2IGFuZCBmdXR1cmUgYWRyZXNzaW5nIHNjaGVtZSBhcmUgZW5jbG9zZWQgYmV0d2VlbiBicmFja2V0cworICAgICAqLworICAgIGlmICgqY3VyID09ICdbJykgeworICAgICAgICBjdXIrKzsKKwl3aGlsZSAoKCpjdXIgIT0gJ10nKSAmJiAoKmN1ciAhPSAwKSkKKwkgICAgY3VyKys7CisJaWYgKCpjdXIgIT0gJ10nKQorCSAgICByZXR1cm4oMSk7CisJY3VyKys7CisJZ290byBmb3VuZDsKKyAgICB9CisgICAgLyoKKyAgICAgKiB0cnkgdG8gcGFyc2UgYW4gSVB2NAorICAgICAqLworICAgIGlmIChJU0FfRElHSVQoY3VyKSkgeworICAgICAgICBpZiAoeG1sUGFyc2UzOTg2RGVjT2N0ZXQoJmN1cikgIT0gMCkKKwkgICAgZ290byBub3RfaXB2NDsKKwlpZiAoKmN1ciAhPSAnLicpCisJICAgIGdvdG8gbm90X2lwdjQ7CisJY3VyKys7CisgICAgICAgIGlmICh4bWxQYXJzZTM5ODZEZWNPY3RldCgmY3VyKSAhPSAwKQorCSAgICBnb3RvIG5vdF9pcHY0OworCWlmICgqY3VyICE9ICcuJykKKwkgICAgZ290byBub3RfaXB2NDsKKyAgICAgICAgaWYgKHhtbFBhcnNlMzk4NkRlY09jdGV0KCZjdXIpICE9IDApCisJICAgIGdvdG8gbm90X2lwdjQ7CisJaWYgKCpjdXIgIT0gJy4nKQorCSAgICBnb3RvIG5vdF9pcHY0OworICAgICAgICBpZiAoeG1sUGFyc2UzOTg2RGVjT2N0ZXQoJmN1cikgIT0gMCkKKwkgICAgZ290byBub3RfaXB2NDsKKwlnb3RvIGZvdW5kOworbm90X2lwdjQ6CisgICAgICAgIGN1ciA9ICpzdHI7CisgICAgfQorICAgIC8qCisgICAgICogdGhlbiB0aGlzIHNob3VsZCBiZSBhIGhvc3RuYW1lIHdoaWNoIGNhbiBiZSBlbXB0eQorICAgICAqLworICAgIHdoaWxlIChJU0FfVU5SRVNFUlZFRChjdXIpIHx8IElTQV9QQ1RfRU5DT0RFRChjdXIpIHx8IElTQV9TVUJfREVMSU0oY3VyKSkKKyAgICAgICAgTkVYVChjdXIpOworZm91bmQ6CisgICAgaWYgKHVyaSAhPSBOVUxMKSB7CisJaWYgKHVyaS0+YXV0aG9yaXR5ICE9IE5VTEwpIHhtbEZyZWUodXJpLT5hdXRob3JpdHkpOworCXVyaS0+YXV0aG9yaXR5ID0gTlVMTDsKKwlpZiAodXJpLT5zZXJ2ZXIgIT0gTlVMTCkgeG1sRnJlZSh1cmktPnNlcnZlcik7CisJaWYgKGN1ciAhPSBob3N0KSB7CisJICAgIGlmICh1cmktPmNsZWFudXAgJiAyKQorCQl1cmktPnNlcnZlciA9IFNUUk5EVVAoaG9zdCwgY3VyIC0gaG9zdCk7CisJICAgIGVsc2UKKwkJdXJpLT5zZXJ2ZXIgPSB4bWxVUklVbmVzY2FwZVN0cmluZyhob3N0LCBjdXIgLSBob3N0LCBOVUxMKTsKKwl9IGVsc2UKKwkgICAgdXJpLT5zZXJ2ZXIgPSBOVUxMOworICAgIH0KKyAgICAqc3RyID0gY3VyOworICAgIHJldHVybigwKTsKK30KKworLyoqCisgKiB4bWxQYXJzZTM5ODZBdXRob3JpdHk6CisgKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCisgKiBAc3RyOiAgdGhlIHN0cmluZyB0byBhbmFseXplCisgKgorICogUGFyc2UgYW4gYXV0aG9yaXR5IHBhcnQgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKKyAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQorICoKKyAqIGF1dGhvcml0eSAgICAgPSBbIHVzZXJpbmZvICJAIiBdIGhvc3QgWyAiOiIgcG9ydCBdCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NkF1dGhvcml0eSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKmN1cjsKKyAgICBpbnQgcmV0OworCisgICAgY3VyID0gKnN0cjsKKyAgICAvKgorICAgICAqIHRyeSB0byBwYXJzZSBhbiB1c2VyaW5mbyBhbmQgY2hlY2sgZm9yIHRoZSB0cmFpbGluZyBACisgICAgICovCisgICAgcmV0ID0geG1sUGFyc2UzOTg2VXNlcmluZm8odXJpLCAmY3VyKTsKKyAgICBpZiAoKHJldCAhPSAwKSB8fCAoKmN1ciAhPSAnQCcpKQorICAgICAgICBjdXIgPSAqc3RyOworICAgIGVsc2UKKyAgICAgICAgY3VyKys7CisgICAgcmV0ID0geG1sUGFyc2UzOTg2SG9zdCh1cmksICZjdXIpOworICAgIGlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgaWYgKCpjdXIgPT0gJzonKSB7CisgICAgICAgIGN1cisrOworICAgICAgICByZXQgPSB4bWxQYXJzZTM5ODZQb3J0KHVyaSwgJmN1cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9CisgICAgKnN0ciA9IGN1cjsKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKgorICogeG1sUGFyc2UzOTg2U2VnbWVudDoKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqIEBmb3JiaWQ6IGFuIG9wdGlvbmFsIGZvcmJpZGRlbiBjaGFyYWN0ZXIKKyAqIEBlbXB0eTogYWxsb3cgYW4gZW1wdHkgc2VnbWVudAorICoKKyAqIFBhcnNlIGEgc2VnbWVudCBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogc2VnbWVudCAgICAgICA9ICpwY2hhcgorICogc2VnbWVudC1ueiAgICA9IDEqcGNoYXIKKyAqIHNlZ21lbnQtbnotbmMgPSAxKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICJAIiApCisgKiAgICAgICAgICAgICAgIDsgbm9uLXplcm8tbGVuZ3RoIHNlZ21lbnQgd2l0aG91dCBhbnkgY29sb24gIjoiCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NlNlZ21lbnQoY29uc3QgY2hhciAqKnN0ciwgY2hhciBmb3JiaWQsIGludCBlbXB0eSkKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisKKyAgICBjdXIgPSAqc3RyOworICAgIGlmICghSVNBX1BDSEFSKGN1cikpIHsKKyAgICAgICAgaWYgKGVtcHR5KQorCSAgICByZXR1cm4oMCk7CisJcmV0dXJuKDEpOworICAgIH0KKyAgICB3aGlsZSAoSVNBX1BDSEFSKGN1cikgJiYgKCpjdXIgIT0gZm9yYmlkKSkKKyAgICAgICAgTkVYVChjdXIpOworICAgICpzdHIgPSBjdXI7CisgICAgcmV0dXJuICgwKTsKK30KKworLyoqCisgKiB4bWxQYXJzZTM5ODZQYXRoQWJFbXB0eToKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqCisgKiBQYXJzZSBhbiBwYXRoIGFic29sdXRlIG9yIGVtcHR5IGFuZCBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzCisgKiBvZiB0aGUgQHVyaSBzdHJ1Y3R1cmUKKyAqCisgKiBwYXRoLWFiZW1wdHkgID0gKiggIi8iIHNlZ21lbnQgKQorICoKKyAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZTM5ODZQYXRoQWJFbXB0eSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKmN1cjsKKyAgICBpbnQgcmV0OworCisgICAgY3VyID0gKnN0cjsKKworICAgIHdoaWxlICgqY3VyID09ICcvJykgeworICAgICAgICBjdXIrKzsKKwlyZXQgPSB4bWxQYXJzZTM5ODZTZWdtZW50KCZjdXIsIDAsIDEpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgfQorICAgIGlmICh1cmkgIT0gTlVMTCkgeworCWlmICh1cmktPnBhdGggIT0gTlVMTCkgeG1sRnJlZSh1cmktPnBhdGgpOworCWlmICh1cmktPmNsZWFudXAgJiAyKQorCSAgICB1cmktPnBhdGggPSBTVFJORFVQKCpzdHIsIGN1ciAtICpzdHIpOworCWVsc2UKKwkgICAgdXJpLT5wYXRoID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7CisgICAgfQorICAgICpzdHIgPSBjdXI7CisgICAgcmV0dXJuICgwKTsKK30KKworLyoqCisgKiB4bWxQYXJzZTM5ODZQYXRoQWJzb2x1dGU6CisgKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCisgKiBAc3RyOiAgdGhlIHN0cmluZyB0byBhbmFseXplCisgKgorICogUGFyc2UgYW4gcGF0aCBhYnNvbHV0ZSBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogcGF0aC1hYnNvbHV0ZSA9ICIvIiBbIHNlZ21lbnQtbnogKiggIi8iIHNlZ21lbnQgKSBdCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NlBhdGhBYnNvbHV0ZSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKmN1cjsKKyAgICBpbnQgcmV0OworCisgICAgY3VyID0gKnN0cjsKKworICAgIGlmICgqY3VyICE9ICcvJykKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGN1cisrOworICAgIHJldCA9IHhtbFBhcnNlMzk4NlNlZ21lbnQoJmN1ciwgMCwgMCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisJd2hpbGUgKCpjdXIgPT0gJy8nKSB7CisJICAgIGN1cisrOworCSAgICByZXQgPSB4bWxQYXJzZTM5ODZTZWdtZW50KCZjdXIsIDAsIDEpOworCSAgICBpZiAocmV0ICE9IDApIHJldHVybihyZXQpOworCX0KKyAgICB9CisgICAgaWYgKHVyaSAhPSBOVUxMKSB7CisJaWYgKHVyaS0+cGF0aCAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+cGF0aCk7CisJaWYgKHVyaS0+Y2xlYW51cCAmIDIpCisJICAgIHVyaS0+cGF0aCA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7CisJZWxzZQorCSAgICB1cmktPnBhdGggPSB4bWxVUklVbmVzY2FwZVN0cmluZygqc3RyLCBjdXIgLSAqc3RyLCBOVUxMKTsKKyAgICB9CisgICAgKnN0ciA9IGN1cjsKKyAgICByZXR1cm4gKDApOworfQorCisvKioKKyAqIHhtbFBhcnNlMzk4NlBhdGhSb290bGVzczoKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqCisgKiBQYXJzZSBhbiBwYXRoIHdpdGhvdXQgcm9vdCBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogcGF0aC1yb290bGVzcyA9IHNlZ21lbnQtbnogKiggIi8iIHNlZ21lbnQgKQorICoKKyAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZTM5ODZQYXRoUm9vdGxlc3MoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisgICAgaW50IHJldDsKKworICAgIGN1ciA9ICpzdHI7CisKKyAgICByZXQgPSB4bWxQYXJzZTM5ODZTZWdtZW50KCZjdXIsIDAsIDApOworICAgIGlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgd2hpbGUgKCpjdXIgPT0gJy8nKSB7CisgICAgICAgIGN1cisrOworCXJldCA9IHhtbFBhcnNlMzk4NlNlZ21lbnQoJmN1ciwgMCwgMSk7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9CisgICAgaWYgKHVyaSAhPSBOVUxMKSB7CisJaWYgKHVyaS0+cGF0aCAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+cGF0aCk7CisJaWYgKHVyaS0+Y2xlYW51cCAmIDIpCisJICAgIHVyaS0+cGF0aCA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7CisJZWxzZQorCSAgICB1cmktPnBhdGggPSB4bWxVUklVbmVzY2FwZVN0cmluZygqc3RyLCBjdXIgLSAqc3RyLCBOVUxMKTsKKyAgICB9CisgICAgKnN0ciA9IGN1cjsKKyAgICByZXR1cm4gKDApOworfQorCisvKioKKyAqIHhtbFBhcnNlMzk4NlBhdGhOb1NjaGVtZToKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqCisgKiBQYXJzZSBhbiBwYXRoIHdoaWNoIGlzIG5vdCBhIHNjaGVtZSBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogcGF0aC1ub3NjaGVtZSA9IHNlZ21lbnQtbnotbmMgKiggIi8iIHNlZ21lbnQgKQorICoKKyAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZTM5ODZQYXRoTm9TY2hlbWUoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisgICAgaW50IHJldDsKKworICAgIGN1ciA9ICpzdHI7CisKKyAgICByZXQgPSB4bWxQYXJzZTM5ODZTZWdtZW50KCZjdXIsICc6JywgMCk7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB3aGlsZSAoKmN1ciA9PSAnLycpIHsKKyAgICAgICAgY3VyKys7CisJcmV0ID0geG1sUGFyc2UzOTg2U2VnbWVudCgmY3VyLCAwLCAxKTsKKwlpZiAocmV0ICE9IDApIHJldHVybihyZXQpOworICAgIH0KKyAgICBpZiAodXJpICE9IE5VTEwpIHsKKwlpZiAodXJpLT5wYXRoICE9IE5VTEwpIHhtbEZyZWUodXJpLT5wYXRoKTsKKwlpZiAodXJpLT5jbGVhbnVwICYgMikKKwkgICAgdXJpLT5wYXRoID0gU1RSTkRVUCgqc3RyLCBjdXIgLSAqc3RyKTsKKwllbHNlCisJICAgIHVyaS0+cGF0aCA9IHhtbFVSSVVuZXNjYXBlU3RyaW5nKCpzdHIsIGN1ciAtICpzdHIsIE5VTEwpOworICAgIH0KKyAgICAqc3RyID0gY3VyOworICAgIHJldHVybiAoMCk7Cit9CisKKy8qKgorICogeG1sUGFyc2UzOTg2SGllclBhcnQ6CisgKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCisgKiBAc3RyOiAgdGhlIHN0cmluZyB0byBhbmFseXplCisgKgorICogUGFyc2UgYW4gaGllcmFyY2hpY2FsIHBhcnQgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKKyAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQorICoKKyAqIGhpZXItcGFydCAgICAgPSAiLy8iIGF1dGhvcml0eSBwYXRoLWFiZW1wdHkKKyAqICAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZQorICogICAgICAgICAgICAgICAgLyBwYXRoLXJvb3RsZXNzCisgKiAgICAgICAgICAgICAgICAvIHBhdGgtZW1wdHkKKyAqCisgKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludAoreG1sUGFyc2UzOTg2SGllclBhcnQoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpjdXI7CisgICAgaW50IHJldDsKKworICAgIGN1ciA9ICpzdHI7CisKKyAgICBpZiAoKCpjdXIgPT0gJy8nKSAmJiAoKihjdXIgKyAxKSA9PSAnLycpKSB7CisgICAgICAgIGN1ciArPSAyOworCXJldCA9IHhtbFBhcnNlMzk4NkF1dGhvcml0eSh1cmksICZjdXIpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisJcmV0ID0geG1sUGFyc2UzOTg2UGF0aEFiRW1wdHkodXJpLCAmY3VyKTsKKwlpZiAocmV0ICE9IDApIHJldHVybihyZXQpOworCSpzdHIgPSBjdXI7CisJcmV0dXJuKDApOworICAgIH0gZWxzZSBpZiAoKmN1ciA9PSAnLycpIHsKKyAgICAgICAgcmV0ID0geG1sUGFyc2UzOTg2UGF0aEFic29sdXRlKHVyaSwgJmN1cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9IGVsc2UgaWYgKElTQV9QQ0hBUihjdXIpKSB7CisgICAgICAgIHJldCA9IHhtbFBhcnNlMzk4NlBhdGhSb290bGVzcyh1cmksICZjdXIpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXRoLWVtcHR5IGlzIGVmZmVjdGl2ZWx5IGVtcHR5ICovCisJaWYgKHVyaSAhPSBOVUxMKSB7CisJICAgIGlmICh1cmktPnBhdGggIT0gTlVMTCkgeG1sRnJlZSh1cmktPnBhdGgpOworCSAgICB1cmktPnBhdGggPSBOVUxMOworCX0KKyAgICB9CisgICAgKnN0ciA9IGN1cjsKKyAgICByZXR1cm4gKDApOworfQorCisvKioKKyAqIHhtbFBhcnNlMzk4NlJlbGF0aXZlUmVmOgorICogQHVyaTogIHBvaW50ZXIgdG8gYW4gVVJJIHN0cnVjdHVyZQorICogQHN0cjogIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIGFuIFVSSSBzdHJpbmcgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKKyAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQorICoKKyAqIHJlbGF0aXZlLXJlZiAgPSByZWxhdGl2ZS1wYXJ0IFsgIj8iIHF1ZXJ5IF0gWyAiIyIgZnJhZ21lbnQgXQorICogcmVsYXRpdmUtcGFydCA9ICIvLyIgYXV0aG9yaXR5IHBhdGgtYWJlbXB0eQorICogICAgICAgICAgICAgICAvIHBhdGgtYWJzb2x1dGUKKyAqICAgICAgICAgICAgICAgLyBwYXRoLW5vc2NoZW1lCisgKiAgICAgICAgICAgICAgIC8gcGF0aC1lbXB0eQorICoKKyAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50Cit4bWxQYXJzZTM5ODZSZWxhdGl2ZVJlZih4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCgqc3RyID09ICcvJykgJiYgKCooc3RyICsgMSkgPT0gJy8nKSkgeworICAgICAgICBzdHIgKz0gMjsKKwlyZXQgPSB4bWxQYXJzZTM5ODZBdXRob3JpdHkodXJpLCAmc3RyKTsKKwlpZiAocmV0ICE9IDApIHJldHVybihyZXQpOworCXJldCA9IHhtbFBhcnNlMzk4NlBhdGhBYkVtcHR5KHVyaSwgJnN0cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJy8nKSB7CisJcmV0ID0geG1sUGFyc2UzOTg2UGF0aEFic29sdXRlKHVyaSwgJnN0cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9IGVsc2UgaWYgKElTQV9QQ0hBUihzdHIpKSB7CisgICAgICAgIHJldCA9IHhtbFBhcnNlMzk4NlBhdGhOb1NjaGVtZSh1cmksICZzdHIpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXRoLWVtcHR5IGlzIGVmZmVjdGl2ZWx5IGVtcHR5ICovCisJaWYgKHVyaSAhPSBOVUxMKSB7CisJICAgIGlmICh1cmktPnBhdGggIT0gTlVMTCkgeG1sRnJlZSh1cmktPnBhdGgpOworCSAgICB1cmktPnBhdGggPSBOVUxMOworCX0KKyAgICB9CisKKyAgICBpZiAoKnN0ciA9PSAnPycpIHsKKwlzdHIrKzsKKwlyZXQgPSB4bWxQYXJzZTM5ODZRdWVyeSh1cmksICZzdHIpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgfQorICAgIGlmICgqc3RyID09ICcjJykgeworCXN0cisrOworCXJldCA9IHhtbFBhcnNlMzk4NkZyYWdtZW50KHVyaSwgJnN0cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9CisgICAgaWYgKCpzdHIgIT0gMCkgeworCXhtbENsZWFuVVJJKHVyaSk7CisJcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKworLyoqCisgKiB4bWxQYXJzZTM5ODZVUkk6CisgKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCisgKiBAc3RyOiAgdGhlIHN0cmluZyB0byBhbmFseXplCisgKgorICogUGFyc2UgYW4gVVJJIHN0cmluZyBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcworICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogc2NoZW1lICI6IiBoaWVyLXBhcnQgWyAiPyIgcXVlcnkgXSBbICIjIiBmcmFnbWVudCBdCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NlVSSSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0geG1sUGFyc2UzOTg2U2NoZW1lKHVyaSwgJnN0cik7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICBpZiAoKnN0ciAhPSAnOicpIHsKKwlyZXR1cm4oMSk7CisgICAgfQorICAgIHN0cisrOworICAgIHJldCA9IHhtbFBhcnNlMzk4NkhpZXJQYXJ0KHVyaSwgJnN0cik7CisgICAgaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICBpZiAoKnN0ciA9PSAnPycpIHsKKwlzdHIrKzsKKwlyZXQgPSB4bWxQYXJzZTM5ODZRdWVyeSh1cmksICZzdHIpOworCWlmIChyZXQgIT0gMCkgcmV0dXJuKHJldCk7CisgICAgfQorICAgIGlmICgqc3RyID09ICcjJykgeworCXN0cisrOworCXJldCA9IHhtbFBhcnNlMzk4NkZyYWdtZW50KHVyaSwgJnN0cik7CisJaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKKyAgICB9CisgICAgaWYgKCpzdHIgIT0gMCkgeworCXhtbENsZWFuVVJJKHVyaSk7CisJcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKgorICogeG1sUGFyc2UzOTg2VVJJUmVmZXJlbmNlOgorICogQHVyaTogIHBvaW50ZXIgdG8gYW4gVVJJIHN0cnVjdHVyZQorICogQHN0cjogIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIGFuIFVSSSByZWZlcmVuY2Ugc3RyaW5nIGFuZCBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzCisgKiBvZiB0aGUgQHVyaSBzdHJ1Y3R1cmUKKyAqCisgKiBVUkktcmVmZXJlbmNlID0gVVJJIC8gcmVsYXRpdmUtcmVmCisgKgorICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQKK3htbFBhcnNlMzk4NlVSSVJlZmVyZW5jZSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHN0ciA9PSBOVUxMKQorCXJldHVybigtMSk7CisgICAgeG1sQ2xlYW5VUkkodXJpKTsKKworICAgIC8qCisgICAgICogVHJ5IGZpcnN0IHRvIHBhcnNlIGFic29sdXRlIHJlZnMsIHRoZW4gZmFsbGJhY2sgdG8gcmVsYXRpdmUgaWYKKyAgICAgKiBpdCBmYWlscy4KKyAgICAgKi8KKyAgICByZXQgPSB4bWxQYXJzZTM5ODZVUkkodXJpLCBzdHIpOworICAgIGlmIChyZXQgIT0gMCkgeworCXhtbENsZWFuVVJJKHVyaSk7CisgICAgICAgIHJldCA9IHhtbFBhcnNlMzk4NlJlbGF0aXZlUmVmKHVyaSwgc3RyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkgICAgeG1sQ2xlYW5VUkkodXJpKTsKKwkgICAgcmV0dXJuKHJldCk7CisJfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKgorICogeG1sUGFyc2VVUkk6CisgKiBAc3RyOiAgdGhlIFVSSSBzdHJpbmcgdG8gYW5hbHl6ZQorICoKKyAqIFBhcnNlIGFuIFVSSSBiYXNlZCBvbiBSRkMgMzk4NgorICoKKyAqIFVSSS1yZWZlcmVuY2UgPSBbIGFic29sdXRlVVJJIHwgcmVsYXRpdmVVUkkgXSBbICIjIiBmcmFnbWVudCBdCisgKgorICogUmV0dXJucyBhIG5ld2x5IGJ1aWx0IHhtbFVSSVB0ciBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworeG1sVVJJUHRyCit4bWxQYXJzZVVSSShjb25zdCBjaGFyICpzdHIpIHsKKyAgICB4bWxVUklQdHIgdXJpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3RyID09IE5VTEwpCisJcmV0dXJuKE5VTEwpOworICAgIHVyaSA9IHhtbENyZWF0ZVVSSSgpOworICAgIGlmICh1cmkgIT0gTlVMTCkgeworCXJldCA9IHhtbFBhcnNlMzk4NlVSSVJlZmVyZW5jZSh1cmksIHN0cik7CisgICAgICAgIGlmIChyZXQpIHsKKwkgICAgeG1sRnJlZVVSSSh1cmkpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorICAgIH0KKyAgICByZXR1cm4odXJpKTsKK30KKworLyoqCisgKiB4bWxQYXJzZVVSSVJlZmVyZW5jZToKKyAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKKyAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKKyAqCisgKiBQYXJzZSBhbiBVUkkgcmVmZXJlbmNlIHN0cmluZyBiYXNlZCBvbiBSRkMgMzk4NiBhbmQgZmlsbHMgaW4gdGhlCisgKiBhcHByb3ByaWF0ZSBmaWVsZHMgb2YgdGhlIEB1cmkgc3RydWN0dXJlCisgKgorICogVVJJLXJlZmVyZW5jZSA9IFVSSSAvIHJlbGF0aXZlLXJlZgorICoKKyAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQorICovCitpbnQKK3htbFBhcnNlVVJJUmVmZXJlbmNlKHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHJldHVybih4bWxQYXJzZTM5ODZVUklSZWZlcmVuY2UodXJpLCBzdHIpKTsKK30KKworLyoqCisgKiB4bWxQYXJzZVVSSVJhdzoKKyAqIEBzdHI6ICB0aGUgVVJJIHN0cmluZyB0byBhbmFseXplCisgKiBAcmF3OiAgaWYgMSB1bmVzY2FwaW5nIG9mIFVSSSBwaWVjZXMgYXJlIGRpc2FibGVkCisgKgorICogUGFyc2UgYW4gVVJJIGJ1dCBhbGxvd3MgdG8ga2VlcCBpbnRhY3QgdGhlIG9yaWdpbmFsIGZyYWdtZW50cy4KKyAqCisgKiBVUkktcmVmZXJlbmNlID0gVVJJIC8gcmVsYXRpdmUtcmVmCisgKgorICogUmV0dXJucyBhIG5ld2x5IGJ1aWx0IHhtbFVSSVB0ciBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworeG1sVVJJUHRyCit4bWxQYXJzZVVSSVJhdyhjb25zdCBjaGFyICpzdHIsIGludCByYXcpIHsKKyAgICB4bWxVUklQdHIgdXJpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3RyID09IE5VTEwpCisJcmV0dXJuKE5VTEwpOworICAgIHVyaSA9IHhtbENyZWF0ZVVSSSgpOworICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBpZiAocmF3KSB7CisJICAgIHVyaS0+Y2xlYW51cCB8PSAyOworCX0KKwlyZXQgPSB4bWxQYXJzZVVSSVJlZmVyZW5jZSh1cmksIHN0cik7CisgICAgICAgIGlmIChyZXQpIHsKKwkgICAgeG1sRnJlZVVSSSh1cmkpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorICAgIH0KKyAgICByZXR1cm4odXJpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkqCiAgKgkJCUdlbmVyaWMgVVJJIHN0cnVjdHVyZSBmdW5jdGlvbnMJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjUsNiArOTgzLDcgQEAKIHhtbENoYXIgKgogeG1sU2F2ZVVyaSh4bWxVUklQdHIgdXJpKSB7CiAgICAgeG1sQ2hhciAqcmV0ID0gTlVMTDsKKyAgICB4bWxDaGFyICp0ZW1wOwogICAgIGNvbnN0IGNoYXIgKnA7CiAgICAgaW50IGxlbjsKICAgICBpbnQgbWF4OwpAQCAtMjQ2LDIzICsxMDA1LDI3IEBACiAJd2hpbGUgKCpwICE9IDApIHsKIAkgICAgaWYgKGxlbiA+PSBtYXgpIHsKIAkJbWF4ICo9IDI7Ci0JCXJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCQlpZiAocmV0ID09IE5VTEwpIHsKKwkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOworCQlpZiAodGVtcCA9PSBOVUxMKSB7CiAJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCSAgICAieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7CisJCSAgICB4bWxGcmVlKHJldCk7CiAJCSAgICByZXR1cm4oTlVMTCk7CiAJCX0KKwkJcmV0ID0gdGVtcDsKIAkgICAgfQogCSAgICByZXRbbGVuKytdID0gKnArKzsKIAl9CiAJaWYgKGxlbiA+PSBtYXgpIHsKIAkgICAgbWF4ICo9IDI7Ci0JICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCSAgICBpZiAocmV0ID09IE5VTEwpIHsKKwkgICAgdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOworCSAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworCQl4bWxGcmVlKHJldCk7CiAJCXJldHVybihOVUxMKTsKIAkgICAgfQorCSAgICByZXQgPSB0ZW1wOwogCX0KIAlyZXRbbGVuKytdID0gJzonOwogICAgIH0KQEAgLTI3MSwxMiArMTAzNCwxNCBAQAogCXdoaWxlICgqcCAhPSAwKSB7CiAJICAgIGlmIChsZW4gKyAzID49IG1heCkgewogCQltYXggKj0gMjsKLQkJcmV0ID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCWlmIChyZXQgPT0gTlVMTCkgeworCQl0ZW1wID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7CisJCWlmICh0ZW1wID09IE5VTEwpIHsKIAkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJICAgICJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJICAgIHhtbEZyZWUocmV0KTsKIAkJICAgIHJldHVybihOVUxMKTsKIAkJfQorCQlyZXQgPSB0ZW1wOwogCSAgICB9CiAJICAgIGlmIChJU19SRVNFUlZFRCgqKHApKSB8fCBJU19VTlJFU0VSVkVEKCoocCkpKQogCQlyZXRbbGVuKytdID0gKnArKzsKQEAgLTI5MiwxMiArMTA1NywxNCBAQAogCWlmICh1cmktPnNlcnZlciAhPSBOVUxMKSB7CiAJICAgIGlmIChsZW4gKyAzID49IG1heCkgewogCQltYXggKj0gMjsKLQkJcmV0ID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCWlmIChyZXQgPT0gTlVMTCkgeworCQl0ZW1wID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7CisJCWlmICh0ZW1wID09IE5VTEwpIHsKIAkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJICAgICJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgIHhtbEZyZWUocmV0KTsgIAogCQkgICAgcmV0dXJuKE5VTEwpOwogCQl9CisJCXJldCA9IHRlbXA7CiAJICAgIH0KIAkgICAgcmV0W2xlbisrXSA9ICcvJzsKIAkgICAgcmV0W2xlbisrXSA9ICcvJzsKQEAgLTMwNiwxMyArMTA3MywxNSBAQAogCQl3aGlsZSAoKnAgIT0gMCkgewogCQkgICAgaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCQltYXggKj0gMjsKLQkJCXJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAorCQkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJCShtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCQlpZiAocmV0ID09IE5VTEwpIHsKKwkJCWlmICh0ZW1wID09IE5VTEwpIHsKIAkJCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCQkgICAgInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJICAgIHhtbEZyZWUocmV0KTsKIAkJCSAgICByZXR1cm4oTlVMTCk7CiAJCQl9CisJCQlyZXQgPSB0ZW1wOwogCQkgICAgfQogCQkgICAgaWYgKChJU19VTlJFU0VSVkVEKCoocCkpKSB8fAogCQkJKCgqKHApID09ICc7JykpIHx8ICgoKihwKSA9PSAnOicpKSB8fApAQCAtMzMwLDEzICsxMDk5LDE1IEBACiAJCX0KIAkJaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCSAgICBtYXggKj0gMjsKLQkJICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAorCQkgICAgdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJICAgIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCSAgICBpZiAocmV0ID09IE5VTEwpIHsKKwkJICAgIGlmICh0ZW1wID09IE5VTEwpIHsKIAkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXhtbEZyZWUocmV0KTsKIAkJCXJldHVybihOVUxMKTsKIAkJICAgIH0KKwkJICAgIHJldCA9IHRlbXA7CiAJCX0KIAkJcmV0W2xlbisrXSA9ICdAJzsKIAkgICAgfQpAQCAtMzQ0LDM5ICsxMTE1LDQ1IEBACiAJICAgIHdoaWxlICgqcCAhPSAwKSB7CiAJCWlmIChsZW4gPj0gbWF4KSB7CiAJCSAgICBtYXggKj0gMjsKLQkJICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAorCQkgICAgdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJICAgIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCSAgICBpZiAocmV0ID09IE5VTEwpIHsKKwkJICAgIGlmICh0ZW1wID09IE5VTEwpIHsKIAkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXhtbEZyZWUocmV0KTsKIAkJCXJldHVybihOVUxMKTsKIAkJICAgIH0KKwkJICAgIHJldCA9IHRlbXA7CiAJCX0KIAkJcmV0W2xlbisrXSA9ICpwKys7CiAJICAgIH0KIAkgICAgaWYgKHVyaS0+cG9ydCA+IDApIHsKIAkJaWYgKGxlbiArIDEwID49IG1heCkgewogCQkgICAgbWF4ICo9IDI7Ci0JCSAgICByZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJICAgIHRlbXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKIAkJCSAgICAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCQkgICAgaWYgKHJldCA9PSBOVUxMKSB7CisJCSAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCQkieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKHJldCk7CiAJCQlyZXR1cm4oTlVMTCk7CiAJCSAgICB9CisJCSAgICByZXQgPSB0ZW1wOwogCQl9CiAJCWxlbiArPSBzbnByaW50ZigoY2hhciAqKSAmcmV0W2xlbl0sIG1heCAtIGxlbiwgIjolZCIsIHVyaS0+cG9ydCk7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHVyaS0+YXV0aG9yaXR5ICE9IE5VTEwpIHsKIAkgICAgaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCW1heCAqPSAyOwotCQlyZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJKG1heCArIDEpICogc2l6ZW9mKHhtbENoYXIpKTsKLQkJaWYgKHJldCA9PSBOVUxMKSB7Ci0JCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSAgICAieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCSAgICByZXR1cm4oTlVMTCk7Ci0JCX0KKwkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShyZXQpOworCQkJcmV0dXJuKE5VTEwpOworCQkgICAgfQorCQkgICAgcmV0ID0gdGVtcDsKIAkgICAgfQogCSAgICByZXRbbGVuKytdID0gJy8nOwogCSAgICByZXRbbGVuKytdID0gJy8nOwpAQCAtMzg0LDEzICsxMTYxLDE1IEBACiAJICAgIHdoaWxlICgqcCAhPSAwKSB7CiAJCWlmIChsZW4gKyAzID49IG1heCkgewogCQkgICAgbWF4ICo9IDI7Ci0JCSAgICByZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJICAgIHRlbXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKIAkJCSAgICAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCQkgICAgaWYgKHJldCA9PSBOVUxMKSB7CisJCSAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCQkieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKHJldCk7CiAJCQlyZXR1cm4oTlVMTCk7CiAJCSAgICB9CisJCSAgICByZXQgPSB0ZW1wOwogCQl9CiAJCWlmICgoSVNfVU5SRVNFUlZFRCgqKHApKSkgfHwKICAgICAgICAgICAgICAgICAgICAgKCgqKHApID09ICckJykpIHx8ICgoKihwKSA9PSAnLCcpKSB8fCAoKCoocCkgPT0gJzsnKSkgfHwKQEAgLTQwOCwyMCArMTE4NywzMSBAQAogCX0gZWxzZSBpZiAodXJpLT5zY2hlbWUgIT0gTlVMTCkgewogCSAgICBpZiAobGVuICsgMyA+PSBtYXgpIHsKIAkJbWF4ICo9IDI7Ci0JCXJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAorCQl0ZW1wID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsCiAJCQkobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCQlpZiAocmV0ID09IE5VTEwpIHsKLQkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAotCQkJICAgICJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJICAgIHJldHVybihOVUxMKTsKLQkJfQorCQlpZiAodGVtcCA9PSBOVUxMKSB7CisJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKKwkJCQkieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKHJldCk7CisJCQlyZXR1cm4oTlVMTCk7CisJCSAgICB9CisJCSAgICByZXQgPSB0ZW1wOwogCSAgICB9CiAJICAgIHJldFtsZW4rK10gPSAnLyc7CiAJICAgIHJldFtsZW4rK10gPSAnLyc7CiAJfQogCWlmICh1cmktPnBhdGggIT0gTlVMTCkgewogCSAgICBwID0gdXJpLT5wYXRoOwotCSAgICB3aGlsZSAoKnAgIT0gMCkgeworCSAgICAvKgorCSAgICAgKiB0aGUgY29sb24gaW4gZmlsZTovLy9kOiBzaG91bGQgbm90IGJlIGVzY2FwZWQgb3IKKwkgICAgICogV2luZG93cyBhY2Nlc3NlcyBmYWlsIGxhdGVyLgorCSAgICAgKi8KKwkgICAgaWYgKCh1cmktPnNjaGVtZSAhPSBOVUxMKSAmJgorCQkocFswXSA9PSAnLycpICYmCisJCSgoKHBbMV0gPj0gJ2EnKSAmJiAocFsxXSA8PSAneicpKSB8fAorCQkgKChwWzFdID49ICdBJykgJiYgKHBbMV0gPD0gJ1onKSkpICYmCisJCShwWzJdID09ICc6JykgJiYKKwkgICAgICAgICh4bWxTdHJFcXVhbChCQURfQ0FTVCB1cmktPnNjaGVtZSwgQkFEX0NBU1QgImZpbGUiKSkpIHsKIAkJaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCSAgICBtYXggKj0gMjsKIAkJICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LApAQCAtNDMyLDYgKzEyMjIsMjMgQEAKIAkJCXJldHVybihOVUxMKTsKIAkJICAgIH0KIAkJfQorCQlyZXRbbGVuKytdID0gKnArKzsKKwkJcmV0W2xlbisrXSA9ICpwKys7CisJCXJldFtsZW4rK10gPSAqcCsrOworCSAgICB9CisJICAgIHdoaWxlICgqcCAhPSAwKSB7CisJCWlmIChsZW4gKyAzID49IG1heCkgeworCQkgICAgbWF4ICo9IDI7CisJCSAgICB0ZW1wID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsCisJCQkgICAgKG1heCArIDEpICogc2l6ZW9mKHhtbENoYXIpKTsKKwkJICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKwkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAorCQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUocmV0KTsKKwkJCXJldHVybihOVUxMKTsKKwkJICAgIH0KKwkJICAgIHJldCA9IHRlbXA7CisJCX0KIAkJaWYgKChJU19VTlJFU0VSVkVEKCoocCkpKSB8fCAoKCoocCkgPT0gJy8nKSkgfHwKICAgICAgICAgICAgICAgICAgICAgKCgqKHApID09ICc7JykpIHx8ICgoKihwKSA9PSAnQCcpKSB8fCAoKCoocCkgPT0gJyYnKSkgfHwKIAkgICAgICAgICAgICAoKCoocCkgPT0gJz0nKSkgfHwgKCgqKHApID09ICcrJykpIHx8ICgoKihwKSA9PSAnJCcpKSB8fApAQCAtNDQ5LDUyICsxMjU2LDYwIEBACiAJaWYgKHVyaS0+cXVlcnlfcmF3ICE9IE5VTEwpIHsKIAkgICAgaWYgKGxlbiArIDEgPj0gbWF4KSB7CiAJCW1heCAqPSAyOwotCQlyZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJKG1heCArIDEpICogc2l6ZW9mKHhtbENoYXIpKTsKLQkJaWYgKHJldCA9PSBOVUxMKSB7Ci0JCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSAgICAieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCSAgICByZXR1cm4oTlVMTCk7Ci0JCX0KKwkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShyZXQpOworCQkJcmV0dXJuKE5VTEwpOworCQkgICAgfQorCQkgICAgcmV0ID0gdGVtcDsKIAkgICAgfQogCSAgICByZXRbbGVuKytdID0gJz8nOwogCSAgICBwID0gdXJpLT5xdWVyeV9yYXc7CiAJICAgIHdoaWxlICgqcCAhPSAwKSB7CiAJCWlmIChsZW4gKyAxID49IG1heCkgewogCQkgICAgbWF4ICo9IDI7Ci0JCSAgICByZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJICAgIHRlbXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKIAkJCSAgICAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCQkgICAgaWYgKHJldCA9PSBOVUxMKSB7CisJCSAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCQkieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKHJldCk7CiAJCQlyZXR1cm4oTlVMTCk7CiAJCSAgICB9CisJCSAgICByZXQgPSB0ZW1wOwogCQl9CiAJCXJldFtsZW4rK10gPSAqcCsrOwogCSAgICB9CiAJfSBlbHNlIGlmICh1cmktPnF1ZXJ5ICE9IE5VTEwpIHsKIAkgICAgaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCW1heCAqPSAyOwotCQlyZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJKG1heCArIDEpICogc2l6ZW9mKHhtbENoYXIpKTsKLQkJaWYgKHJldCA9PSBOVUxMKSB7Ci0JCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSAgICAieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCSAgICByZXR1cm4oTlVMTCk7Ci0JCX0KKwkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShyZXQpOworCQkJcmV0dXJuKE5VTEwpOworCQkgICAgfQorCQkgICAgcmV0ID0gdGVtcDsKIAkgICAgfQogCSAgICByZXRbbGVuKytdID0gJz8nOwogCSAgICBwID0gdXJpLT5xdWVyeTsKIAkgICAgd2hpbGUgKCpwICE9IDApIHsKIAkJaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCSAgICBtYXggKj0gMjsKLQkJICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAorCQkgICAgdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJICAgIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JCSAgICBpZiAocmV0ID09IE5VTEwpIHsKKwkJICAgIGlmICh0ZW1wID09IE5VTEwpIHsKIAkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUocmV0KTsKIAkJCXJldHVybihOVUxMKTsKIAkJICAgIH0KKwkJICAgIHJldCA9IHRlbXA7CiAJCX0KIAkJaWYgKChJU19VTlJFU0VSVkVEKCoocCkpKSB8fCAoSVNfUkVTRVJWRUQoKihwKSkpKSAKIAkJICAgIHJldFtsZW4rK10gPSAqcCsrOwpAQCAtNTExLDI2ICsxMzI2LDMwIEBACiAgICAgaWYgKHVyaS0+ZnJhZ21lbnQgIT0gTlVMTCkgewogCWlmIChsZW4gKyAzID49IG1heCkgewogCSAgICBtYXggKj0gMjsKLQkgICAgcmV0ID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsCisJICAgIHRlbXAgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKIAkJICAgIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7Ci0JICAgIGlmIChyZXQgPT0gTlVMTCkgewotCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuKE5VTEwpOwotCSAgICB9CisJICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKwkJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAorCQkJCSJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUocmV0KTsKKwkJCXJldHVybihOVUxMKTsKKwkJICAgIH0KKwkJICAgIHJldCA9IHRlbXA7CiAJfQogCXJldFtsZW4rK10gPSAnIyc7CiAJcCA9IHVyaS0+ZnJhZ21lbnQ7CiAJd2hpbGUgKCpwICE9IDApIHsKIAkgICAgaWYgKGxlbiArIDMgPj0gbWF4KSB7CiAJCW1heCAqPSAyOwotCQlyZXQgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKHJldCwKKwkJdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LAogCQkJKG1heCArIDEpICogc2l6ZW9mKHhtbENoYXIpKTsKLQkJaWYgKHJldCA9PSBOVUxMKSB7Ci0JCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSAgICAieG1sU2F2ZVVyaTogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCSAgICByZXR1cm4oTlVMTCk7Ci0JCX0KKwkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShyZXQpOworCQkJcmV0dXJuKE5VTEwpOworCQkgICAgfQorCQkgICAgcmV0ID0gdGVtcDsKIAkgICAgfQogCSAgICBpZiAoKElTX1VOUkVTRVJWRUQoKihwKSkpIHx8IChJU19SRVNFUlZFRCgqKHApKSkpIAogCQlyZXRbbGVuKytdID0gKnArKzsKQEAgLTU0NSwxMiArMTM2NCwxNCBAQAogICAgIH0KICAgICBpZiAobGVuID49IG1heCkgewogCW1heCAqPSAyOwotCXJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCAobWF4ICsgMSkgKiBzaXplb2YoeG1sQ2hhcikpOwotCWlmIChyZXQgPT0gTlVMTCkgewotCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJICAgICJ4bWxTYXZlVXJpOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkgICAgcmV0dXJuKE5VTEwpOwotCX0KKwl0ZW1wID0gKHhtbENoYXIgKikgeG1sUmVhbGxvYyhyZXQsIChtYXggKyAxKSAqIHNpemVvZih4bWxDaGFyKSk7CisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCisJCQkJInhtbFNhdmVVcmk6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShyZXQpOworCQkJcmV0dXJuKE5VTEwpOworCQkgICAgfQorCQkgICAgcmV0ID0gdGVtcDsKICAgICB9CiAgICAgcmV0W2xlbisrXSA9IDA7CiAgICAgcmV0dXJuKHJldCk7CkBAIC05MDQsNiArMTcyNSw3IEBACiB4bWxDaGFyICoKIHhtbFVSSUVzY2FwZVN0cihjb25zdCB4bWxDaGFyICpzdHIsIGNvbnN0IHhtbENoYXIgKmxpc3QpIHsKICAgICB4bWxDaGFyICpyZXQsIGNoOworICAgIHhtbENoYXIgKnRlbXA7CiAgICAgY29uc3QgeG1sQ2hhciAqaW47CiAKICAgICB1bnNpZ25lZCBpbnQgbGVuLCBvdXQ7CkBAIC05MjcsMTIgKzE3NDksMTQgQEAKICAgICB3aGlsZSgqaW4gIT0gMCkgewogCWlmIChsZW4gLSBvdXQgPD0gMykgewogCSAgICBsZW4gKz0gMjA7Ci0JICAgIHJldCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCBsZW4pOwotCSAgICBpZiAocmV0ID09IE5VTEwpIHsKKwkgICAgdGVtcCA9ICh4bWxDaGFyICopIHhtbFJlYWxsb2MocmV0LCBsZW4pOworCSAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAJCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkJInhtbFVSSUVzY2FwZVN0cjogb3V0IG9mIG1lbW9yeVxuIik7CisJCXhtbEZyZWUocmV0KTsKIAkJcmV0dXJuKE5VTEwpOwogCSAgICB9CisJICAgIHJldCA9IHRlbXA7CiAJfQogCiAJY2ggPSAqaW47CkBAIC05ODUsNyArMTgwOSw4IEBACiAjZGVmaW5lIE5VTExDSEsocCkgaWYoIXApIHsgXAogICAgICAgICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAieG1sVVJJRXNjYXBlOiBvdXQgb2YgbWVtb3J5XG4iKTsgXAotICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyB9CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlVVJJKHVyaSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyB9IFwKIAogICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTEwMzgsNyArMTg2Myw3IEBACiAgICAgICAgIHNlZ21lbnQgPSB4bWxVUklFc2NhcGVTdHIoQkFEX0NBU1QgdXJpLT5zZXJ2ZXIsIEJBRF9DQVNUICIvPzs6QCIpOwogICAgICAgICBOVUxMQ0hLKHNlZ21lbnQpCiAJCWlmICh1cmktPnVzZXIgPT0gTlVMTCkKLSAgICAgICAJCXJldCA9IHhtbFN0cmNhdChyZXQsIEJBRF9DQVNUICIvLyIpOworCQlyZXQgPSB4bWxTdHJjYXQocmV0LCBCQURfQ0FTVCAiLy8iKTsKICAgICAgICAgcmV0ID0geG1sU3RyY2F0KHJldCwgc2VnbWVudCk7CiAgICAgICAgIHhtbEZyZWUoc2VnbWVudCk7CiAgICAgfQpAQCAtMTA5NSw3ODcgKzE5MjAsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKLSAqCQkJRXNjYXBlZCBVUkkgcGFyc2luZwkJCQkqCi0gKgkJCQkJCQkJCSoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogeG1sUGFyc2VVUklGcmFnbWVudDoKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQotICoKLSAqIFBhcnNlIGFuIFVSSSBmcmFnbWVudCBzdHJpbmcgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKLSAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZS4KLSAqIAotICogZnJhZ21lbnQgPSAqdXJpYwotICoKLSAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50Ci14bWxQYXJzZVVSSUZyYWdtZW50KHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpCi17Ci0gICAgY29uc3QgY2hhciAqY3VyOwotICAgIAotICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0KLSAgICBjdXIgPSAqc3RyOwotCi0gICAgd2hpbGUgKElTX1VSSUMoY3VyKSB8fCBJU19VTldJU0UoY3VyKSkKLSAgICAgICAgTkVYVChjdXIpOwotICAgIGlmICh1cmkgIT0gTlVMTCkgewotICAgICAgICBpZiAodXJpLT5mcmFnbWVudCAhPSBOVUxMKQotICAgICAgICAgICAgeG1sRnJlZSh1cmktPmZyYWdtZW50KTsKLQlpZiAodXJpLT5jbGVhbnVwICYgMikKLQkgICAgdXJpLT5mcmFnbWVudCA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7Ci0JZWxzZQotCSAgICB1cmktPmZyYWdtZW50ID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSVF1ZXJ5OgotICogQHVyaTogIHBvaW50ZXIgdG8gYW4gVVJJIHN0cnVjdHVyZQotICogQHN0cjogIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0byBhbmFseXplCi0gKgotICogUGFyc2UgdGhlIHF1ZXJ5IHBhcnQgb2YgYW4gVVJJCi0gKiAKLSAqIHF1ZXJ5ID0gKnVyaWMKLSAqCi0gKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKLSAqLwotc3RhdGljIGludAoteG1sUGFyc2VVUklRdWVyeSh4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKQotewotICAgIGNvbnN0IGNoYXIgKmN1cjsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0KLSAgICBjdXIgPSAqc3RyOwotCi0gICAgd2hpbGUgKChJU19VUklDKGN1cikpIHx8Ci0gICAgICAgICAgICgodXJpICE9IE5VTEwpICYmICh1cmktPmNsZWFudXAgJiAxKSAmJiAoSVNfVU5XSVNFKGN1cikpKSkKLSAgICAgICAgTkVYVChjdXIpOwotICAgIGlmICh1cmkgIT0gTlVMTCkgewotICAgICAgICBpZiAodXJpLT5xdWVyeSAhPSBOVUxMKQotICAgICAgICAgICAgeG1sRnJlZSh1cmktPnF1ZXJ5KTsKLQlpZiAodXJpLT5jbGVhbnVwICYgMikKLQkgICAgdXJpLT5xdWVyeSA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7Ci0JZWxzZQotCSAgICB1cmktPnF1ZXJ5ID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7Ci0KLQkvKiBTYXZlIHRoZSByYXcgYnl0ZXMgb2YgdGhlIHF1ZXJ5IGFzIHdlbGwuCi0JICogU2VlOiBodHRwOi8vbWFpbC5nbm9tZS5vcmcvYXJjaGl2ZXMveG1sLzIwMDctQXByaWwvdGhyZWFkLmh0bWwjMDAxMTQKLQkgKi8KLQlpZiAodXJpLT5xdWVyeV9yYXcgIT0gTlVMTCkKLQkgICAgeG1sRnJlZSAodXJpLT5xdWVyeV9yYXcpOwotCXVyaS0+cXVlcnlfcmF3ID0gU1RSTkRVUCAoKnN0ciwgY3VyIC0gKnN0cik7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSVNjaGVtZToKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQotICoKLSAqIFBhcnNlIGFuIFVSSSBzY2hlbWUKLSAqIAotICogc2NoZW1lID0gYWxwaGEgKiggYWxwaGEgfCBkaWdpdCB8ICIrIiB8ICItIiB8ICIuIiApCi0gKgotICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCi0gKi8KLXN0YXRpYyBpbnQKLXhtbFBhcnNlVVJJU2NoZW1lKHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpIHsKLSAgICBjb25zdCBjaGFyICpjdXI7Ci0KLSAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuKC0xKTsKLSAgICAKLSAgICBjdXIgPSAqc3RyOwotICAgIGlmICghSVNfQUxQSEEoKmN1cikpCi0JcmV0dXJuKDIpOwotICAgIGN1cisrOwotICAgIHdoaWxlIChJU19TQ0hFTUUoKmN1cikpIGN1cisrOwotICAgIGlmICh1cmkgIT0gTlVMTCkgewotCWlmICh1cmktPnNjaGVtZSAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+c2NoZW1lKTsKLQl1cmktPnNjaGVtZSA9IFNUUk5EVVAoKnN0ciwgY3VyIC0gKnN0cik7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuKDApOwotfQotCi0vKioKLSAqIHhtbFBhcnNlVVJJT3BhcXVlUGFydDoKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQotICoKLSAqIFBhcnNlIGFuIFVSSSBvcGFxdWUgcGFydAotICogCi0gKiBvcGFxdWVfcGFydCA9IHVyaWNfbm9fc2xhc2ggKnVyaWMKLSAqCi0gKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKLSAqLwotc3RhdGljIGludAoteG1sUGFyc2VVUklPcGFxdWVQYXJ0KHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpCi17Ci0gICAgY29uc3QgY2hhciAqY3VyOwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKC0xKTsKLQotICAgIGN1ciA9ICpzdHI7Ci0gICAgaWYgKCEoKElTX1VSSUNfTk9fU0xBU0goY3VyKSkgfHwKLSAgICAgICAgICAoKHVyaSAhPSBOVUxMKSAmJiAodXJpLT5jbGVhbnVwICYgMSkgJiYgKElTX1VOV0lTRShjdXIpKSkpKSB7Ci0gICAgICAgIHJldHVybiAoMyk7Ci0gICAgfQotICAgIE5FWFQoY3VyKTsKLSAgICB3aGlsZSAoKElTX1VSSUMoY3VyKSkgfHwKLSAgICAgICAgICAgKCh1cmkgIT0gTlVMTCkgJiYgKHVyaS0+Y2xlYW51cCAmIDEpICYmIChJU19VTldJU0UoY3VyKSkpKQotICAgICAgICBORVhUKGN1cik7Ci0gICAgaWYgKHVyaSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh1cmktPm9wYXF1ZSAhPSBOVUxMKQotICAgICAgICAgICAgeG1sRnJlZSh1cmktPm9wYXF1ZSk7Ci0JaWYgKHVyaS0+Y2xlYW51cCAmIDIpCi0JICAgIHVyaS0+b3BhcXVlID0gU1RSTkRVUCgqc3RyLCBjdXIgLSAqc3RyKTsKLQllbHNlCi0JICAgIHVyaS0+b3BhcXVlID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSVNlcnZlcjoKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQotICoKLSAqIFBhcnNlIGEgc2VydmVyIHN1YnBhcnQgb2YgYW4gVVJJLCBpdCdzIGEgZmluZXIgZ3JhaW4gYW5hbHlzaXMKLSAqIG9mIHRoZSBhdXRob3JpdHkgcGFydC4KLSAqIAotICogc2VydmVyICAgICAgICA9IFsgWyB1c2VyaW5mbyAiQCIgXSBob3N0cG9ydCBdCi0gKiB1c2VyaW5mbyAgICAgID0gKiggdW5yZXNlcnZlZCB8IGVzY2FwZWQgfAotICogICAgICAgICAgICAgICAgICAgICAgICI7IiB8ICI6IiB8ICImIiB8ICI9IiB8ICIrIiB8ICIkIiB8ICIsIiApCi0gKiBob3N0cG9ydCAgICAgID0gaG9zdCBbICI6IiBwb3J0IF0KLSAqIGhvc3QgICAgICAgICAgPSBob3N0bmFtZSB8IElQdjRhZGRyZXNzIHwgSVB2NnJlZmVyZW5jZQotICogaG9zdG5hbWUgICAgICA9ICooIGRvbWFpbmxhYmVsICIuIiApIHRvcGxhYmVsIFsgIi4iIF0KLSAqIGRvbWFpbmxhYmVsICAgPSBhbHBoYW51bSB8IGFscGhhbnVtICooIGFscGhhbnVtIHwgIi0iICkgYWxwaGFudW0KLSAqIHRvcGxhYmVsICAgICAgPSBhbHBoYSB8IGFscGhhICooIGFscGhhbnVtIHwgIi0iICkgYWxwaGFudW0KLSAqIElQdjZyZWZlcmVuY2UgPSAiWyIgSVB2NmFkZHJlc3MgIl0iCi0gKiBJUHY2YWRkcmVzcyAgID0gaGV4cGFydCBbICI6IiBJUHY0YWRkcmVzcyBdCi0gKiBJUHY0YWRkcmVzcyAgID0gMSozZGlnaXQgIi4iIDEqM2RpZ2l0ICIuIiAxKjNkaWdpdCAiLiIgMSozZGlnaXQKLSAqIGhleHBhcnQgICAgICAgPSBoZXhzZXEgfCBoZXhzZXEgIjo6IiBbIGhleHNlcSBdfCAiOjoiIFsgaGV4c2VxIF0KLSAqIGhleHNlcSAgICAgICAgPSBoZXg0ICooICI6IiBoZXg0KQotICogaGV4NCAgICAgICAgICA9IDEqNGhleGRpZwotICogcG9ydCAgICAgICAgICA9ICpkaWdpdAotICoKLSAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50Ci14bWxQYXJzZVVSSVNlcnZlcih4bWxVUklQdHIgdXJpLCBjb25zdCBjaGFyICoqc3RyKSB7Ci0gICAgY29uc3QgY2hhciAqY3VyOwotICAgIGNvbnN0IGNoYXIgKmhvc3QsICp0bXA7Ci0gICAgY29uc3QgaW50IElQVjRtYXggPSA0OwotICAgIGNvbnN0IGludCBJUFY2bWF4ID0gODsKLSAgICBpbnQgb2N0OwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybigtMSk7Ci0gICAgCi0gICAgY3VyID0gKnN0cjsKLQotICAgIC8qCi0gICAgICogaXMgdGhlcmUgYSB1c2VyaW5mbyA/Ci0gICAgICovCi0gICAgd2hpbGUgKElTX1VTRVJJTkZPKGN1cikpIE5FWFQoY3VyKTsKLSAgICBpZiAoKmN1ciA9PSAnQCcpIHsKLQlpZiAodXJpICE9IE5VTEwpIHsKLQkgICAgaWYgKHVyaS0+dXNlciAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+dXNlcik7Ci0JICAgIGlmICh1cmktPmNsZWFudXAgJiAyKQotCQl1cmktPnVzZXIgPSBTVFJORFVQKCpzdHIsIGN1ciAtICpzdHIpOwotCSAgICBlbHNlCi0JCXVyaS0+dXNlciA9IHhtbFVSSVVuZXNjYXBlU3RyaW5nKCpzdHIsIGN1ciAtICpzdHIsIE5VTEwpOwotCX0KLQljdXIrKzsKLSAgICB9IGVsc2UgewotCWlmICh1cmkgIT0gTlVMTCkgewotCSAgICBpZiAodXJpLT51c2VyICE9IE5VTEwpIHhtbEZyZWUodXJpLT51c2VyKTsKLQkgICAgdXJpLT51c2VyID0gTlVMTDsKLQl9Ci0gICAgICAgIGN1ciA9ICpzdHI7Ci0gICAgfQotICAgIC8qCi0gICAgICogVGhpcyBjYW4gYmUgZW1wdHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gc2VydmVyCi0gICAgICovCi0gICAgaG9zdCA9IGN1cjsKLSAgICBpZiAoKmN1ciA9PSAnLycpIHsKLQlpZiAodXJpICE9IE5VTEwpIHsKLQkgICAgaWYgKHVyaS0+YXV0aG9yaXR5ICE9IE5VTEwpIHhtbEZyZWUodXJpLT5hdXRob3JpdHkpOwotCSAgICB1cmktPmF1dGhvcml0eSA9IE5VTEw7Ci0JICAgIGlmICh1cmktPnNlcnZlciAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+c2VydmVyKTsKLQkgICAgdXJpLT5zZXJ2ZXIgPSBOVUxMOwotCSAgICB1cmktPnBvcnQgPSAwOwotCX0KLQlyZXR1cm4oMCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogaG9zdCBwYXJ0IG9mIGhvc3Rwb3J0IGNhbiBkZW5vdGUgYW4gSVBWNCBhZGRyZXNzLCBhbiBJUFY2IGFkZHJlc3MKLSAgICAgKiBvciBhbiB1bnJlc29sdmVkIG5hbWUuIENoZWNrIHRoZSBJUCBmaXJzdCwgaXRzIGVhc2llciB0byBkZXRlY3QKLSAgICAgKiBlcnJvcnMgaWYgd3Jvbmcgb25lLgotICAgICAqIEFuIElQVjYgYWRkcmVzcyBtdXN0IHN0YXJ0IHdpdGggYSAnWycgYW5kIGVuZCB3aXRoIGEgJ10nLgotICAgICAqLwotICAgIGlmICgqY3VyID09ICdbJykgewotCWludCBjb21wcmVzcz0wOwotCWN1cisrOwotCWZvciAob2N0ID0gMDsgb2N0IDwgSVBWNm1heDsgKytvY3QpIHsKLQkgICAgaWYgKCpjdXIgPT0gJzonKSB7Ci0JCWlmIChjb21wcmVzcykKLQkJICAgIHJldHVybigzKTsJLyogbXVsdGlwbGUgY29tcHJlc3Npb24gYXR0ZW1wdGVkICovCi0JCWlmICghb2N0KSB7IAkvKiBpbml0aWFsIGNoYXIgaXMgY29tcHJlc3Npb24gKi8KLQkJICAgIGlmICgqKytjdXIgIT0gJzonKQotCQkJcmV0dXJuKDMpOwotCQl9Ci0JCWNvbXByZXNzID0gMTsJLyogc2V0IGNvbXByZXNzaW9uLWVuY291bnRlcmVkIGZsYWcgKi8KLQkJY3VyKys7CQkvKiBza2lwIG92ZXIgdGhlIHNlY29uZCAnOicgKi8KLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgd2hpbGUoSVNfSEVYKCpjdXIpKSBjdXIrKzsKLQkgICAgaWYgKG9jdCA9PSAoSVBWNm1heC0xKSkKLQkJY29udGludWU7Ci0JICAgIGlmICgqY3VyICE9ICc6JykKLQkJYnJlYWs7Ci0JICAgIGN1cisrOwotCX0KLQlpZiAoKCFjb21wcmVzcykgJiYgKG9jdCAhPSBJUFY2bWF4KSkKLQkgICAgcmV0dXJuKDMpOwotCWlmICgqY3VyICE9ICddJykKLQkgICAgcmV0dXJuKDMpOwotCWlmICh1cmkgIT0gTlVMTCkgewotCSAgICBpZiAodXJpLT5zZXJ2ZXIgIT0gTlVMTCkgeG1sRnJlZSh1cmktPnNlcnZlcik7Ci0JICAgIHVyaS0+c2VydmVyID0gKGNoYXIgKil4bWxTdHJuZHVwKCh4bWxDaGFyICopaG9zdCsxLAotCQkJKGN1ci1ob3N0KS0xKTsKLQl9Ci0JY3VyKys7Ci0gICAgfSBlbHNlIHsKLQkvKgotCSAqIE5vdCBJUFY2LCBtYXliZSBJUFY0Ci0JICovCi0JZm9yIChvY3QgPSAwOyBvY3QgPCBJUFY0bWF4OyArK29jdCkgewotICAgICAgICAgICAgaWYgKCpjdXIgPT0gJy4nKSAKLSAgICAgICAgICAgICAgICByZXR1cm4oMyk7IC8qIGUuZy4gaHR0cDovLy54bWwvIG9yIGh0dHA6Ly8xOC4yOS4uMzAvICovCi0gICAgICAgICAgICB3aGlsZShJU19ESUdJVCgqY3VyKSkgY3VyKys7Ci0gICAgICAgICAgICBpZiAob2N0ID09IChJUFY0bWF4LTEpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKCpjdXIgIT0gJy4nKQotCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjdXIrKzsKLQl9Ci0gICAgfQotICAgIGlmICgoaG9zdFswXSAhPSAnWycpICYmIChvY3QgPCBJUFY0bWF4IHx8ICgqY3VyID09ICcuJyAmJiBjdXIrKykgfHwKLQkJCSAgICAgSVNfQUxQSEEoKmN1cikpKSB7Ci0gICAgICAgIC8qIG1heWJlIGhvc3RfbmFtZSAqLwotICAgICAgICBpZiAoIUlTX0FMUEhBTlVNKCpjdXIpKQotICAgICAgICAgICAgcmV0dXJuKDQpOyAvKiBlLmcuIGh0dHA6Ly94bWwuJG9mdCAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBkbyArK2N1cjsgd2hpbGUgKElTX0FMUEhBTlVNKCpjdXIpKTsKLSAgICAgICAgICAgIGlmICgqY3VyID09ICctJykgewotCSAgICAgICAgLS1jdXI7Ci0gICAgICAgICAgICAgICAgaWYgKCpjdXIgPT0gJy4nKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oNSk7IC8qIGUuZy4gaHR0cDovL3htbC4tc29mdCAqLwotCSAgICAgICAgKytjdXI7Ci0JCWNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgIAkgICAgaWYgKCpjdXIgPT0gJy4nKSB7Ci0JICAgICAgICAtLWN1cjsKLSAgICAgICAgICAgICAgICBpZiAoKmN1ciA9PSAnLScpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybig2KTsgLyogZS5nLiBodHRwOi8veG1sLS5zb2Z0ICovCi0gICAgICAgICAgICAgICAgaWYgKCpjdXIgPT0gJy4nKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oNyk7IC8qIGUuZy4gaHR0cDovL3htbC4uc29mdCAqLwotCSAgICAgICAgKytjdXI7Ci0JCWNvbnRpbnVlOwotICAgICAgICAgICAgfQotCSAgICBicmVhazsKLSAgICAgICAgfSB3aGlsZSAoMSk7Ci0gICAgICAgIHRtcCA9IGN1cjsKLSAgICAgICAgaWYgKHRtcFstMV0gPT0gJy4nKQotICAgICAgICAgICAgLS10bXA7IC8qIGUuZy4gaHR0cDovL3htbC4kT2Z0LyAqLwotICAgICAgICBkbyAtLXRtcDsgd2hpbGUgKHRtcCA+PSBob3N0ICYmIElTX0FMUEhBTlVNKCp0bXApKTsKLSAgICAgICAgaWYgKCgrK3RtcCA9PSBob3N0IHx8IHRtcFstMV0gPT0gJy4nKSAmJiAhSVNfQUxQSEEoKnRtcCkpCi0gICAgICAgICAgICByZXR1cm4oOCk7IC8qIGUuZy4gaHR0cDovL3htbHNPZnQuMHJnLyAqLwotICAgIH0KLSAgICBpZiAodXJpICE9IE5VTEwpIHsKLQlpZiAodXJpLT5hdXRob3JpdHkgIT0gTlVMTCkgeG1sRnJlZSh1cmktPmF1dGhvcml0eSk7Ci0JdXJpLT5hdXRob3JpdHkgPSBOVUxMOwotCWlmIChob3N0WzBdICE9ICdbJykgewkvKiBpdCdzIG5vdCBhbiBJUFY2IGFkZHIgKi8KLQkgICAgaWYgKHVyaS0+c2VydmVyICE9IE5VTEwpIHhtbEZyZWUodXJpLT5zZXJ2ZXIpOwotCSAgICBpZiAodXJpLT5jbGVhbnVwICYgMikKLQkJdXJpLT5zZXJ2ZXIgPSBTVFJORFVQKGhvc3QsIGN1ciAtIGhvc3QpOwotCSAgICBlbHNlCi0JCXVyaS0+c2VydmVyID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoaG9zdCwgY3VyIC0gaG9zdCwgTlVMTCk7Ci0JfQotICAgIH0KLSAgICAvKgotICAgICAqIGZpbmlzaCBieSBjaGVja2luZyBmb3IgYSBwb3J0IHByZXNlbmNlLgotICAgICAqLwotICAgIGlmICgqY3VyID09ICc6JykgewotICAgICAgICBjdXIrKzsKLQlpZiAoSVNfRElHSVQoKmN1cikpIHsKLQkgICAgaWYgKHVyaSAhPSBOVUxMKQotCSAgICAgICAgdXJpLT5wb3J0ID0gMDsKLQkgICAgd2hpbGUgKElTX0RJR0lUKCpjdXIpKSB7Ci0JICAgICAgICBpZiAodXJpICE9IE5VTEwpCi0JCSAgICB1cmktPnBvcnQgPSB1cmktPnBvcnQgKiAxMCArICgqY3VyIC0gJzAnKTsKLQkJY3VyKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuKDApOwotfQkKLQotLyoqCi0gKiB4bWxQYXJzZVVSSVJlbFNlZ21lbnQ6Ci0gKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCi0gKiBAc3RyOiAgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqCi0gKiBQYXJzZSBhbiBVUkkgcmVsYXRpdmUgc2VnbWVudAotICogCi0gKiByZWxfc2VnbWVudCA9IDEqKCB1bnJlc2VydmVkIHwgZXNjYXBlZCB8ICI7IiB8ICJAIiB8ICImIiB8ICI9IiB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIisiIHwgIiQiIHwgIiwiICkKLSAqCi0gKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKLSAqLwotc3RhdGljIGludAoteG1sUGFyc2VVUklSZWxTZWdtZW50KHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpCi17Ci0gICAgY29uc3QgY2hhciAqY3VyOwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKC0xKTsKLQotICAgIGN1ciA9ICpzdHI7Ci0gICAgaWYgKCEoKElTX1NFR01FTlQoY3VyKSkgfHwKLSAgICAgICAgICAoKHVyaSAhPSBOVUxMKSAmJiAodXJpLT5jbGVhbnVwICYgMSkgJiYgKElTX1VOV0lTRShjdXIpKSkpKSB7Ci0gICAgICAgIHJldHVybiAoMyk7Ci0gICAgfQotICAgIE5FWFQoY3VyKTsKLSAgICB3aGlsZSAoKElTX1NFR01FTlQoY3VyKSkgfHwKLSAgICAgICAgICAgKCh1cmkgIT0gTlVMTCkgJiYgKHVyaS0+Y2xlYW51cCAmIDEpICYmIChJU19VTldJU0UoY3VyKSkpKQotICAgICAgICBORVhUKGN1cik7Ci0gICAgaWYgKHVyaSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh1cmktPnBhdGggIT0gTlVMTCkKLSAgICAgICAgICAgIHhtbEZyZWUodXJpLT5wYXRoKTsKLQlpZiAodXJpLT5jbGVhbnVwICYgMikKLQkgICAgdXJpLT5wYXRoID0gU1RSTkRVUCgqc3RyLCBjdXIgLSAqc3RyKTsKLQllbHNlCi0JICAgIHVyaS0+cGF0aCA9IHhtbFVSSVVuZXNjYXBlU3RyaW5nKCpzdHIsIGN1ciAtICpzdHIsIE5VTEwpOwotICAgIH0KLSAgICAqc3RyID0gY3VyOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qKgotICogeG1sUGFyc2VVUklQYXRoU2VnbWVudHM6Ci0gKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCi0gKiBAc3RyOiAgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqIEBzbGFzaDogIHNob3VsZCB3ZSBhZGQgYSBsZWFkaW5nIHNsYXNoCi0gKgotICogUGFyc2UgYW4gVVJJIHNldCBvZiBwYXRoIHNlZ21lbnRzCi0gKiAKLSAqIHBhdGhfc2VnbWVudHMgPSBzZWdtZW50ICooICIvIiBzZWdtZW50ICkKLSAqIHNlZ21lbnQgICAgICAgPSAqcGNoYXIgKiggIjsiIHBhcmFtICkKLSAqIHBhcmFtICAgICAgICAgPSAqcGNoYXIKLSAqCi0gKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKLSAqLwotc3RhdGljIGludAoteG1sUGFyc2VVUklQYXRoU2VnbWVudHMoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0ciwgaW50IHNsYXNoKQotewotICAgIGNvbnN0IGNoYXIgKmN1cjsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0KLSAgICBjdXIgPSAqc3RyOwotCi0gICAgZG8gewotICAgICAgICB3aGlsZSAoKElTX1BDSEFSKGN1cikpIHx8Ci0JICAgICAgICgodXJpICE9IE5VTEwpICYmICh1cmktPmNsZWFudXAgJiAxKSAmJiAoSVNfVU5XSVNFKGN1cikpKSkKLSAgICAgICAgICAgIE5FWFQoY3VyKTsKLSAgICAgICAgd2hpbGUgKCpjdXIgPT0gJzsnKSB7Ci0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICAgIHdoaWxlICgoSVNfUENIQVIoY3VyKSkgfHwKLQkgICAgICAgICAgICgodXJpICE9IE5VTEwpICYmICh1cmktPmNsZWFudXAgJiAxKSAmJiAoSVNfVU5XSVNFKGN1cikpKSkKLSAgICAgICAgICAgICAgICBORVhUKGN1cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpjdXIgIT0gJy8nKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cisrOwotICAgIH0gd2hpbGUgKDEpOwotICAgIGlmICh1cmkgIT0gTlVMTCkgewotICAgICAgICBpbnQgbGVuLCBsZW4yID0gMDsKLSAgICAgICAgY2hhciAqcGF0aDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb25jYXQgdGhlIHNldCBvZiBwYXRoIHNlZ21lbnRzIHRvIHRoZSBjdXJyZW50IHBhdGgKLSAgICAgICAgICovCi0gICAgICAgIGxlbiA9IGN1ciAtICpzdHI7Ci0gICAgICAgIGlmIChzbGFzaCkKLSAgICAgICAgICAgIGxlbisrOwotCi0gICAgICAgIGlmICh1cmktPnBhdGggIT0gTlVMTCkgewotICAgICAgICAgICAgbGVuMiA9IHN0cmxlbih1cmktPnBhdGgpOwotICAgICAgICAgICAgbGVuICs9IGxlbjI7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0aCA9IChjaGFyICopIHhtbE1hbGxvY0F0b21pYyhsZW4gKyAxKTsKLSAgICAgICAgaWYgKHBhdGggPT0gTlVMTCkgewotCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkgICAgCQkgICAgInhtbFBhcnNlVVJJUGF0aFNlZ21lbnRzOiBvdXQgb2YgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICpzdHIgPSBjdXI7Ci0gICAgICAgICAgICByZXR1cm4gKC0xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXJpLT5wYXRoICE9IE5VTEwpCi0gICAgICAgICAgICBtZW1jcHkocGF0aCwgdXJpLT5wYXRoLCBsZW4yKTsKLSAgICAgICAgaWYgKHNsYXNoKSB7Ci0gICAgICAgICAgICBwYXRoW2xlbjJdID0gJy8nOwotICAgICAgICAgICAgbGVuMisrOwotICAgICAgICB9Ci0gICAgICAgIHBhdGhbbGVuMl0gPSAwOwotICAgICAgICBpZiAoY3VyIC0gKnN0ciA+IDApIHsKLQkgICAgaWYgKHVyaS0+Y2xlYW51cCAmIDIpIHsKLQkgICAgICAgIG1lbWNweSgmcGF0aFtsZW4yXSwgKnN0ciwgY3VyIC0gKnN0cik7Ci0JCXBhdGhbbGVuMiArIChjdXIgLSAqc3RyKV0gPSAwOwotCSAgICB9IGVsc2UKLQkJeG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgJnBhdGhbbGVuMl0pOwotCX0KLSAgICAgICAgaWYgKHVyaS0+cGF0aCAhPSBOVUxMKQotICAgICAgICAgICAgeG1sRnJlZSh1cmktPnBhdGgpOwotICAgICAgICB1cmktPnBhdGggPSBwYXRoOwotICAgIH0KLSAgICAqc3RyID0gY3VyOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qKgotICogeG1sUGFyc2VVUklBdXRob3JpdHk6Ci0gKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCi0gKiBAc3RyOiAgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqCi0gKiBQYXJzZSB0aGUgYXV0aG9yaXR5IHBhcnQgb2YgYW4gVVJJLgotICogCi0gKiBhdXRob3JpdHkgPSBzZXJ2ZXIgfCByZWdfbmFtZQotICogc2VydmVyICAgID0gWyBbIHVzZXJpbmZvICJAIiBdIGhvc3Rwb3J0IF0KLSAqIHJlZ19uYW1lICA9IDEqKCB1bnJlc2VydmVkIHwgZXNjYXBlZCB8ICIkIiB8ICIsIiB8ICI7IiB8ICI6IiB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICJAIiB8ICImIiB8ICI9IiB8ICIrIiApCi0gKgotICogTm90ZSA6IHRoaXMgaXMgY29tcGxldGVseSBhbWJpZ3VvdXMgc2luY2UgcmVnX25hbWUgaXMgYWxsb3dlZCB0bwotICogICAgICAgIHVzZSB0aGUgZnVsbCBzZXQgb2YgY2hhcnMgaW4gdXNlIGJ5IHNlcnZlcjoKLSAqCi0gKiAgICAgICAgMy4yLjEuIFJlZ2lzdHJ5LWJhc2VkIE5hbWluZyBBdXRob3JpdHkKLSAqCi0gKiAgICAgICAgVGhlIHN0cnVjdHVyZSBvZiBhIHJlZ2lzdHJ5LWJhc2VkIG5hbWluZyBhdXRob3JpdHkgaXMgc3BlY2lmaWMKLSAqICAgICAgICB0byB0aGUgVVJJIHNjaGVtZSwgYnV0IGNvbnN0cmFpbmVkIHRvIHRoZSBhbGxvd2VkIGNoYXJhY3RlcnMKLSAqICAgICAgICBmb3IgYW4gYXV0aG9yaXR5IGNvbXBvbmVudC4KLSAqCi0gKiBSZXR1cm5zIDAgb3IgdGhlIGVycm9yIGNvZGUKLSAqLwotc3RhdGljIGludAoteG1sUGFyc2VVUklBdXRob3JpdHkoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikgewotICAgIGNvbnN0IGNoYXIgKmN1cjsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybigtMSk7Ci0gICAgCi0gICAgY3VyID0gKnN0cjsKLQotICAgIC8qCi0gICAgICogdHJ5IGZpcnN0IHRvIHBhcnNlIGl0IGFzIGEgc2VydmVyIHN0cmluZy4KLSAgICAgKi8KLSAgICByZXQgPSB4bWxQYXJzZVVSSVNlcnZlcih1cmksIHN0cik7Ci0gICAgaWYgKChyZXQgPT0gMCkgJiYgKCpzdHIgIT0gTlVMTCkgJiYKLQkoKCoqc3RyID09IDApIHx8ICgqKnN0ciA9PSAnLycpIHx8ICgqKnN0ciA9PSAnPycpKSkKLSAgICAgICAgcmV0dXJuKDApOwotICAgICpzdHIgPSBjdXI7Ci0KLSAgICAvKgotICAgICAqIGZhaWxlZCwgZmFsbGJhY2sgdG8gcmVnX25hbWUKLSAgICAgKi8KLSAgICBpZiAoIUlTX1JFR19OQU1FKGN1cikpIHsKLQlyZXR1cm4oNSk7Ci0gICAgfQotICAgIE5FWFQoY3VyKTsKLSAgICB3aGlsZSAoSVNfUkVHX05BTUUoY3VyKSkgTkVYVChjdXIpOwotICAgIGlmICh1cmkgIT0gTlVMTCkgewotCWlmICh1cmktPnNlcnZlciAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+c2VydmVyKTsKLQl1cmktPnNlcnZlciA9IE5VTEw7Ci0JaWYgKHVyaS0+dXNlciAhPSBOVUxMKSB4bWxGcmVlKHVyaS0+dXNlcik7Ci0JdXJpLT51c2VyID0gTlVMTDsKLQlpZiAodXJpLT5hdXRob3JpdHkgIT0gTlVMTCkgeG1sRnJlZSh1cmktPmF1dGhvcml0eSk7Ci0JaWYgKHVyaS0+Y2xlYW51cCAmIDIpCi0JICAgIHVyaS0+YXV0aG9yaXR5ID0gU1RSTkRVUCgqc3RyLCBjdXIgLSAqc3RyKTsKLQllbHNlCi0JICAgIHVyaS0+YXV0aG9yaXR5ID0geG1sVVJJVW5lc2NhcGVTdHJpbmcoKnN0ciwgY3VyIC0gKnN0ciwgTlVMTCk7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuKDApOwotfQotCi0vKioKLSAqIHhtbFBhcnNlVVJJSGllclBhcnQ6Ci0gKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCi0gKiBAc3RyOiAgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqCi0gKiBQYXJzZSBhbiBVUkkgaGllcmFyY2hpY2FsIHBhcnQKLSAqIAotICogaGllcl9wYXJ0ID0gKCBuZXRfcGF0aCB8IGFic19wYXRoICkgWyAiPyIgcXVlcnkgXQotICogYWJzX3BhdGggPSAiLyIgIHBhdGhfc2VnbWVudHMKLSAqIG5ldF9wYXRoID0gIi8vIiBhdXRob3JpdHkgWyBhYnNfcGF0aCBdCi0gKgotICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCi0gKi8KLXN0YXRpYyBpbnQKLXhtbFBhcnNlVVJJSGllclBhcnQoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqKnN0cikgewotICAgIGludCByZXQ7Ci0gICAgY29uc3QgY2hhciAqY3VyOwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybigtMSk7Ci0gICAgCi0gICAgY3VyID0gKnN0cjsKLQotICAgIGlmICgoY3VyWzBdID09ICcvJykgJiYgKGN1clsxXSA9PSAnLycpKSB7Ci0JY3VyICs9IDI7Ci0JcmV0ID0geG1sUGFyc2VVUklBdXRob3JpdHkodXJpLCAmY3VyKTsKLQlpZiAocmV0ICE9IDApCi0JICAgIHJldHVybihyZXQpOwotCWlmIChjdXJbMF0gPT0gJy8nKSB7Ci0JICAgIGN1cisrOwotCSAgICByZXQgPSB4bWxQYXJzZVVSSVBhdGhTZWdtZW50cyh1cmksICZjdXIsIDEpOwotCX0KLSAgICB9IGVsc2UgaWYgKGN1clswXSA9PSAnLycpIHsKLQljdXIrKzsKLQlyZXQgPSB4bWxQYXJzZVVSSVBhdGhTZWdtZW50cyh1cmksICZjdXIsIDEpOwotICAgIH0gZWxzZSB7Ci0JcmV0dXJuKDQpOwotICAgIH0KLSAgICBpZiAocmV0ICE9IDApCi0JcmV0dXJuKHJldCk7Ci0gICAgaWYgKCpjdXIgPT0gJz8nKSB7Ci0JY3VyKys7Ci0JcmV0ID0geG1sUGFyc2VVUklRdWVyeSh1cmksICZjdXIpOwotCWlmIChyZXQgIT0gMCkKLQkgICAgcmV0dXJuKHJldCk7Ci0gICAgfQotICAgICpzdHIgPSBjdXI7Ci0gICAgcmV0dXJuKDApOwotfQotCi0vKioKLSAqIHhtbFBhcnNlQWJzb2x1dGVVUkk6Ci0gKiBAdXJpOiAgcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlCi0gKiBAc3RyOiAgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqCi0gKiBQYXJzZSBhbiBVUkkgcmVmZXJlbmNlIHN0cmluZyBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcwotICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCi0gKiAKLSAqIGFic29sdXRlVVJJICAgPSBzY2hlbWUgIjoiICggaGllcl9wYXJ0IHwgb3BhcXVlX3BhcnQgKQotICoKLSAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50Ci14bWxQYXJzZUFic29sdXRlVVJJKHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpIHsKLSAgICBpbnQgcmV0OwotICAgIGNvbnN0IGNoYXIgKmN1cjsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4oLTEpOwotICAgIAotICAgIGN1ciA9ICpzdHI7Ci0KLSAgICByZXQgPSB4bWxQYXJzZVVSSVNjaGVtZSh1cmksIHN0cik7Ci0gICAgaWYgKHJldCAhPSAwKSByZXR1cm4ocmV0KTsKLSAgICBpZiAoKipzdHIgIT0gJzonKSB7Ci0JKnN0ciA9IGN1cjsKLQlyZXR1cm4oMSk7Ci0gICAgfQotICAgICgqc3RyKSsrOwotICAgIGlmICgqKnN0ciA9PSAnLycpCi0JcmV0dXJuKHhtbFBhcnNlVVJJSGllclBhcnQodXJpLCBzdHIpKTsKLSAgICByZXR1cm4oeG1sUGFyc2VVUklPcGFxdWVQYXJ0KHVyaSwgc3RyKSk7Ci19Ci0KLS8qKgotICogeG1sUGFyc2VSZWxhdGl2ZVVSSToKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gYW5hbHl6ZQotICoKLSAqIFBhcnNlIGFuIHJlbGF0aXZlIFVSSSBzdHJpbmcgYW5kIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMKLSAqIG9mIHRoZSBAdXJpIHN0cnVjdHVyZQotICogCi0gKiByZWxhdGl2ZVVSSSA9ICggbmV0X3BhdGggfCBhYnNfcGF0aCB8IHJlbF9wYXRoICkgWyAiPyIgcXVlcnkgXQotICogYWJzX3BhdGggPSAiLyIgIHBhdGhfc2VnbWVudHMKLSAqIG5ldF9wYXRoID0gIi8vIiBhdXRob3JpdHkgWyBhYnNfcGF0aCBdCi0gKiByZWxfcGF0aCA9IHJlbF9zZWdtZW50IFsgYWJzX3BhdGggXQotICoKLSAqIFJldHVybnMgMCBvciB0aGUgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50Ci14bWxQYXJzZVJlbGF0aXZlVVJJKHhtbFVSSVB0ciB1cmksIGNvbnN0IGNoYXIgKipzdHIpIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBjb25zdCBjaGFyICpjdXI7Ci0KLSAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuKC0xKTsKLSAgICAKLSAgICBjdXIgPSAqc3RyOwotICAgIGlmICgoY3VyWzBdID09ICcvJykgJiYgKGN1clsxXSA9PSAnLycpKSB7Ci0JY3VyICs9IDI7Ci0JcmV0ID0geG1sUGFyc2VVUklBdXRob3JpdHkodXJpLCAmY3VyKTsKLQlpZiAocmV0ICE9IDApCi0JICAgIHJldHVybihyZXQpOwotCWlmIChjdXJbMF0gPT0gJy8nKSB7Ci0JICAgIGN1cisrOwotCSAgICByZXQgPSB4bWxQYXJzZVVSSVBhdGhTZWdtZW50cyh1cmksICZjdXIsIDEpOwotCX0KLSAgICB9IGVsc2UgaWYgKGN1clswXSA9PSAnLycpIHsKLQljdXIrKzsKLQlyZXQgPSB4bWxQYXJzZVVSSVBhdGhTZWdtZW50cyh1cmksICZjdXIsIDEpOwotICAgIH0gZWxzZSBpZiAoY3VyWzBdICE9ICcjJyAmJiBjdXJbMF0gIT0gJz8nKSB7Ci0JcmV0ID0geG1sUGFyc2VVUklSZWxTZWdtZW50KHVyaSwgJmN1cik7Ci0JaWYgKHJldCAhPSAwKQotCSAgICByZXR1cm4ocmV0KTsKLQlpZiAoY3VyWzBdID09ICcvJykgewotCSAgICBjdXIrKzsKLQkgICAgcmV0ID0geG1sUGFyc2VVUklQYXRoU2VnbWVudHModXJpLCAmY3VyLCAxKTsKLQl9Ci0gICAgfQotICAgIGlmIChyZXQgIT0gMCkKLQlyZXR1cm4ocmV0KTsKLSAgICBpZiAoKmN1ciA9PSAnPycpIHsKLQljdXIrKzsKLQlyZXQgPSB4bWxQYXJzZVVSSVF1ZXJ5KHVyaSwgJmN1cik7Ci0JaWYgKHJldCAhPSAwKQotCSAgICByZXR1cm4ocmV0KTsKLSAgICB9Ci0gICAgKnN0ciA9IGN1cjsKLSAgICByZXR1cm4ocmV0KTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSVJlZmVyZW5jZToKLSAqIEB1cmk6ICBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUKLSAqIEBzdHI6ICB0aGUgc3RyaW5nIHRvIGFuYWx5emUKLSAqCi0gKiBQYXJzZSBhbiBVUkkgcmVmZXJlbmNlIHN0cmluZyBhbmQgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcwotICogb2YgdGhlIEB1cmkgc3RydWN0dXJlCi0gKiAKLSAqIFVSSS1yZWZlcmVuY2UgPSBbIGFic29sdXRlVVJJIHwgcmVsYXRpdmVVUkkgXSBbICIjIiBmcmFnbWVudCBdCi0gKgotICogUmV0dXJucyAwIG9yIHRoZSBlcnJvciBjb2RlCi0gKi8KLWludAoteG1sUGFyc2VVUklSZWZlcmVuY2UoeG1sVVJJUHRyIHVyaSwgY29uc3QgY2hhciAqc3RyKSB7Ci0gICAgaW50IHJldDsKLSAgICBjb25zdCBjaGFyICp0bXAgPSBzdHI7Ci0KLSAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuKC0xKTsKLSAgICB4bWxDbGVhblVSSSh1cmkpOwotCi0gICAgLyoKLSAgICAgKiBUcnkgZmlyc3QgdG8gcGFyc2UgYWJzb2x1dGUgcmVmcywgdGhlbiBmYWxsYmFjayB0byByZWxhdGl2ZSBpZgotICAgICAqIGl0IGZhaWxzLgotICAgICAqLwotICAgIHJldCA9IHhtbFBhcnNlQWJzb2x1dGVVUkkodXJpLCAmc3RyKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLQl4bWxDbGVhblVSSSh1cmkpOwotCXN0ciA9IHRtcDsKLSAgICAgICAgcmV0ID0geG1sUGFyc2VSZWxhdGl2ZVVSSSh1cmksICZzdHIpOwotICAgIH0KLSAgICBpZiAocmV0ICE9IDApIHsKLQl4bWxDbGVhblVSSSh1cmkpOwotCXJldHVybihyZXQpOwotICAgIH0KLQotICAgIGlmICgqc3RyID09ICcjJykgewotCXN0cisrOwotCXJldCA9IHhtbFBhcnNlVVJJRnJhZ21lbnQodXJpLCAmc3RyKTsKLQlpZiAocmV0ICE9IDApIHJldHVybihyZXQpOwotICAgIH0KLSAgICBpZiAoKnN0ciAhPSAwKSB7Ci0JeG1sQ2xlYW5VUkkodXJpKTsKLQlyZXR1cm4oMSk7Ci0gICAgfQotICAgIHJldHVybigwKTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSToKLSAqIEBzdHI6ICB0aGUgVVJJIHN0cmluZyB0byBhbmFseXplCi0gKgotICogUGFyc2UgYW4gVVJJIAotICogCi0gKiBVUkktcmVmZXJlbmNlID0gWyBhYnNvbHV0ZVVSSSB8IHJlbGF0aXZlVVJJIF0gWyAiIyIgZnJhZ21lbnQgXQotICoKLSAqIFJldHVybnMgYSBuZXdseSBidWlsdCB4bWxVUklQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yCi0gKi8KLXhtbFVSSVB0cgoteG1sUGFyc2VVUkkoY29uc3QgY2hhciAqc3RyKSB7Ci0gICAgeG1sVVJJUHRyIHVyaTsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybihOVUxMKTsKLSAgICB1cmkgPSB4bWxDcmVhdGVVUkkoKTsKLSAgICBpZiAodXJpICE9IE5VTEwpIHsKLQlyZXQgPSB4bWxQYXJzZVVSSVJlZmVyZW5jZSh1cmksIHN0cik7Ci0gICAgICAgIGlmIChyZXQpIHsKLQkgICAgeG1sRnJlZVVSSSh1cmkpOwotCSAgICByZXR1cm4oTlVMTCk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4odXJpKTsKLX0KLQotLyoqCi0gKiB4bWxQYXJzZVVSSVJhdzoKLSAqIEBzdHI6ICB0aGUgVVJJIHN0cmluZyB0byBhbmFseXplCi0gKiBAcmF3OiAgaWYgMSB1bmVzY2FwaW5nIG9mIFVSSSBwaWVjZXMgYXJlIGRpc2FibGVkCi0gKgotICogUGFyc2UgYW4gVVJJIGJ1dCBhbGxvd3MgdG8ga2VlcCBpbnRhY3QgdGhlIG9yaWdpbmFsIGZyYWdtZW50cy4KLSAqIAotICogVVJJLXJlZmVyZW5jZSA9IFsgYWJzb2x1dGVVUkkgfCByZWxhdGl2ZVVSSSBdIFsgIiMiIGZyYWdtZW50IF0KLSAqCi0gKiBSZXR1cm5zIGEgbmV3bHkgYnVpbHQgeG1sVVJJUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgotICovCi14bWxVUklQdHIKLXhtbFBhcnNlVVJJUmF3KGNvbnN0IGNoYXIgKnN0ciwgaW50IHJhdykgewotICAgIHhtbFVSSVB0ciB1cmk7Ci0gICAgaW50IHJldDsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4oTlVMTCk7Ci0gICAgdXJpID0geG1sQ3JlYXRlVVJJKCk7Ci0gICAgaWYgKHVyaSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChyYXcpIHsKLQkgICAgdXJpLT5jbGVhbnVwIHw9IDI7Ci0JfQotCXJldCA9IHhtbFBhcnNlVVJJUmVmZXJlbmNlKHVyaSwgc3RyKTsKLSAgICAgICAgaWYgKHJldCkgewotCSAgICB4bWxGcmVlVVJJKHVyaSk7Ci0JICAgIHJldHVybihOVUxMKTsKLQl9Ci0gICAgfQotICAgIHJldHVybih1cmkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJCQkJCSoKICAqCQkJUHVibGljIGZ1bmN0aW9ucwkJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDE4LDYgKzI0NjIsMTEgQEAKIAogICAgIGlmIChwYXRoID09IE5VTEwpCiAJcmV0dXJuKE5VTEwpOworCisgICAgLyogc2FuaXRpemUgZmlsZW5hbWUgc3RhcnRpbmcgd2l0aCAvLyBzbyBpdCBjYW4gYmUgdXNlZCBhcyBVUkkgKi8KKyAgICBpZiAoKHBhdGhbMF0gPT0gJy8nKSAmJiAocGF0aFsxXSA9PSAnLycpICYmIChwYXRoWzJdICE9ICcvJykpCisgICAgICAgIHBhdGgrKzsKKwogICAgIGlmICgodXJpID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgcGF0aCkpICE9IE5VTEwpIHsKIAl4bWxGcmVlVVJJKHVyaSk7CiAJcmV0dXJuIHhtbFN0cmR1cChwYXRoKTsKZGlmZiAtLWdpdCBhL3ZhbGlkLmMgYi92YWxpZC5jCmluZGV4IDI1MTBiOGQuLjliYWJhM2IgMTAwNjQ0Ci0tLSBhL3ZhbGlkLmMKKysrIGIvdmFsaWQuYwpAQCAtMzYsNiArMzYsMTEgQEAKIAkgICAgIlVuaW1wbGVtZW50ZWQgYmxvY2sgYXQgJXM6JWRcbiIsCQkJCVwKICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CiAKKyNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAorc3RhdGljIGludAoreG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZUludGVybmFsKHhtbERvY1B0ciBkb2MsIHhtbEF0dHJpYnV0ZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZSk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgogICoJCQlFcnJvciBoYW5kbGluZyByb3V0aW5lcwkJCQkqCkBAIC0yMDI0LDcgKzIwMjksNyBAQAogCSAgICByZXR1cm4oTlVMTCk7CiAgICAgfQogICAgIGlmICgoZGVmYXVsdFZhbHVlICE9IE5VTEwpICYmIAotICAgICAgICAoIXhtbFZhbGlkYXRlQXR0cmlidXRlVmFsdWUodHlwZSwgZGVmYXVsdFZhbHVlKSkpIHsKKyAgICAgICAgKCF4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlSW50ZXJuYWwoZHRkLT5kb2MsIHR5cGUsIGRlZmF1bHRWYWx1ZSkpKSB7CiAJeG1sRXJyVmFsaWROb2RlKGN0eHQsICh4bWxOb2RlUHRyKSBkdGQsIFhNTF9EVERfQVRUUklCVVRFX0RFRkFVTFQsCiAJICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJXMgb2YgJXM6IGludmFsaWQgZGVmYXVsdCB2YWx1ZVxuIiwKIAkgICAgICAgICAgICAgICAgZWxlbSwgbmFtZSwgZGVmYXVsdFZhbHVlKTsKQEAgLTIwNDIsOCArMjA0NywxMCBAQAogCShkdGQtPmRvYy0+aW50U3Vic2V0ICE9IE5VTEwpICYmCiAJKGR0ZC0+ZG9jLT5pbnRTdWJzZXQtPmF0dHJpYnV0ZXMgIT0gTlVMTCkpIHsKICAgICAgICAgcmV0ID0geG1sSGFzaExvb2t1cDMoZHRkLT5kb2MtPmludFN1YnNldC0+YXR0cmlidXRlcywgbmFtZSwgbnMsIGVsZW0pOwotCWlmIChyZXQgIT0gTlVMTCkKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkgICAgeG1sRnJlZUVudW1lcmF0aW9uKHRyZWUpOwogCSAgICByZXR1cm4oTlVMTCk7CisJfQogICAgIH0KIAogICAgIC8qCkBAIC0yMDU3LDYgKzIwNjQsNyBAQAogICAgIGlmICh0YWJsZSA9PSBOVUxMKSB7CiAJeG1sVkVyck1lbW9yeShjdHh0LAogICAgICAgICAgICAgInhtbEFkZEF0dHJpYnV0ZURlY2w6IFRhYmxlIGNyZWF0aW9uIGZhaWxlZCFcbiIpOworCXhtbEZyZWVFbnVtZXJhdGlvbih0cmVlKTsKICAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIH0KIApAQCAtMjA2NCw2ICsyMDcyLDcgQEAKICAgICByZXQgPSAoeG1sQXR0cmlidXRlUHRyKSB4bWxNYWxsb2Moc2l6ZW9mKHhtbEF0dHJpYnV0ZSkpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewogCXhtbFZFcnJNZW1vcnkoY3R4dCwgIm1hbGxvYyBmYWlsZWQiKTsKKwl4bWxGcmVlRW51bWVyYXRpb24odHJlZSk7CiAJcmV0dXJuKE5VTEwpOwogICAgIH0KICAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sQXR0cmlidXRlKSk7CkBAIC0zNDQ1LDYgKzM0NTQsMTA5IEBACiB9CiAKICNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAorCitzdGF0aWMgaW50Cit4bWxJc0RvY05hbWVTdGFydENoYXIoeG1sRG9jUHRyIGRvYywgaW50IGMpIHsKKyAgICBpZiAoKGRvYyA9PSBOVUxMKSB8fCAoZG9jLT5wcm9wZXJ0aWVzICYgWE1MX0RPQ19PTEQxMCkgPT0gMCkgeworICAgICAgICAvKgorCSAqIFVzZSB0aGUgbmV3IGNoZWNrcyBvZiBwcm9kdWN0aW9uIFs0XSBbNGFdIGFtZCBbNV0gb2YgdGhlCisJICogVXBkYXRlIDUgb2YgWE1MLTEuMAorCSAqLworCWlmICgoKGMgPj0gJ2EnKSAmJiAoYyA8PSAneicpKSB8fAorCSAgICAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fAorCSAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwKKwkgICAgKChjID49IDB4QzApICYmIChjIDw9IDB4RDYpKSB8fAorCSAgICAoKGMgPj0gMHhEOCkgJiYgKGMgPD0gMHhGNikpIHx8CisJICAgICgoYyA+PSAweEY4KSAmJiAoYyA8PSAweDJGRikpIHx8CisJICAgICgoYyA+PSAweDM3MCkgJiYgKGMgPD0gMHgzN0QpKSB8fAorCSAgICAoKGMgPj0gMHgzN0YpICYmIChjIDw9IDB4MUZGRikpIHx8CisJICAgICgoYyA+PSAweDIwMEMpICYmIChjIDw9IDB4MjAwRCkpIHx8CisJICAgICgoYyA+PSAweDIwNzApICYmIChjIDw9IDB4MjE4RikpIHx8CisJICAgICgoYyA+PSAweDJDMDApICYmIChjIDw9IDB4MkZFRikpIHx8CisJICAgICgoYyA+PSAweDMwMDEpICYmIChjIDw9IDB4RDdGRikpIHx8CisJICAgICgoYyA+PSAweEY5MDApICYmIChjIDw9IDB4RkRDRikpIHx8CisJICAgICgoYyA+PSAweEZERjApICYmIChjIDw9IDB4RkZGRCkpIHx8CisJICAgICgoYyA+PSAweDEwMDAwKSAmJiAoYyA8PSAweEVGRkZGKSkpCisJICAgIHJldHVybigxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoSVNfTEVUVEVSKGMpIHx8IChjID09ICdfJykgfHwgKGMgPT0gJzonKSkKKwkgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK3htbElzRG9jTmFtZUNoYXIoeG1sRG9jUHRyIGRvYywgaW50IGMpIHsKKyAgICBpZiAoKGRvYyA9PSBOVUxMKSB8fCAoZG9jLT5wcm9wZXJ0aWVzICYgWE1MX0RPQ19PTEQxMCkgPT0gMCkgeworICAgICAgICAvKgorCSAqIFVzZSB0aGUgbmV3IGNoZWNrcyBvZiBwcm9kdWN0aW9uIFs0XSBbNGFdIGFtZCBbNV0gb2YgdGhlCisJICogVXBkYXRlIDUgb2YgWE1MLTEuMAorCSAqLworCWlmICgoKGMgPj0gJ2EnKSAmJiAoYyA8PSAneicpKSB8fAorCSAgICAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fAorCSAgICAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgKGMgPT0gJ18nKSB8fCAoYyA9PSAnOicpIHx8CisJICAgIChjID09ICctJykgfHwgKGMgPT0gJy4nKSB8fCAoYyA9PSAweEI3KSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgKChjID49IDB4QzApICYmIChjIDw9IDB4RDYpKSB8fAorCSAgICAoKGMgPj0gMHhEOCkgJiYgKGMgPD0gMHhGNikpIHx8CisJICAgICgoYyA+PSAweEY4KSAmJiAoYyA8PSAweDJGRikpIHx8CisJICAgICgoYyA+PSAweDMwMCkgJiYgKGMgPD0gMHgzNkYpKSB8fCAvKiAhc3RhcnQgKi8KKwkgICAgKChjID49IDB4MzcwKSAmJiAoYyA8PSAweDM3RCkpIHx8CisJICAgICgoYyA+PSAweDM3RikgJiYgKGMgPD0gMHgxRkZGKSkgfHwKKwkgICAgKChjID49IDB4MjAwQykgJiYgKGMgPD0gMHgyMDBEKSkgfHwKKwkgICAgKChjID49IDB4MjAzRikgJiYgKGMgPD0gMHgyMDQwKSkgfHwgLyogIXN0YXJ0ICovCisJICAgICgoYyA+PSAweDIwNzApICYmIChjIDw9IDB4MjE4RikpIHx8CisJICAgICgoYyA+PSAweDJDMDApICYmIChjIDw9IDB4MkZFRikpIHx8CisJICAgICgoYyA+PSAweDMwMDEpICYmIChjIDw9IDB4RDdGRikpIHx8CisJICAgICgoYyA+PSAweEY5MDApICYmIChjIDw9IDB4RkRDRikpIHx8CisJICAgICgoYyA+PSAweEZERjApICYmIChjIDw9IDB4RkZGRCkpIHx8CisJICAgICgoYyA+PSAweDEwMDAwKSAmJiAoYyA8PSAweEVGRkZGKSkpCisJICAgICByZXR1cm4oMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChJU19MRVRURVIoYykpIHx8IChJU19ESUdJVChjKSkgfHwKKyAgICAgICAgICAgIChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fAorCSAgICAoYyA9PSAnXycpIHx8IChjID09ICc6JykgfHwKKwkgICAgKElTX0NPTUJJTklORyhjKSkgfHwKKwkgICAgKElTX0VYVEVOREVSKGMpKSkKKwkgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKgorICogeG1sVmFsaWRhdGVOYW1lVmFsdWU6CisgKiBAZG9jOiAgcG9pbnRlciB0byB0aGUgZG9jdW1lbnQgb3IgTlVMTAorICogQHZhbHVlOiAgYW4gTmFtZSB2YWx1ZQorICoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIG1hdGNoIE5hbWUgcHJvZHVjdGlvbgorICoKKyAqIHJldHVybnMgMSBpZiB2YWxpZCBvciAwIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQKK3htbFZhbGlkYXRlTmFtZVZhbHVlSW50ZXJuYWwoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqdmFsdWUpIHsKKyAgICBjb25zdCB4bWxDaGFyICpjdXI7CisgICAgaW50IHZhbCwgbGVuOworCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHJldHVybigwKTsKKyAgICBjdXIgPSB2YWx1ZTsKKyAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOworICAgIGN1ciArPSBsZW47CisgICAgaWYgKCF4bWxJc0RvY05hbWVTdGFydENoYXIoZG9jLCB2YWwpKQorCXJldHVybigwKTsKKworICAgIHZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CisgICAgY3VyICs9IGxlbjsKKyAgICB3aGlsZSAoeG1sSXNEb2NOYW1lQ2hhcihkb2MsIHZhbCkpIHsKKwl2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOworCWN1ciArPSBsZW47CisgICAgfQorCisgICAgaWYgKHZhbCAhPSAwKSByZXR1cm4oMCk7CisKKyAgICByZXR1cm4oMSk7Cit9CisKIC8qKgogICogeG1sVmFsaWRhdGVOYW1lVmFsdWU6CiAgKiBAdmFsdWU6ICBhbiBOYW1lIHZhbHVlCkBAIC0zNDU2LDYgKzM1NjgsMjEgQEAKIAogaW50CiB4bWxWYWxpZGF0ZU5hbWVWYWx1ZShjb25zdCB4bWxDaGFyICp2YWx1ZSkgeworICAgIHJldHVybih4bWxWYWxpZGF0ZU5hbWVWYWx1ZUludGVybmFsKE5VTEwsIHZhbHVlKSk7Cit9CisKKy8qKgorICogeG1sVmFsaWRhdGVOYW1lc1ZhbHVlSW50ZXJuYWw6CisgKiBAZG9jOiAgcG9pbnRlciB0byB0aGUgZG9jdW1lbnQgb3IgTlVMTAorICogQHZhbHVlOiAgYW4gTmFtZXMgdmFsdWUKKyAqCisgKiBWYWxpZGF0ZSB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBtYXRjaCBOYW1lcyBwcm9kdWN0aW9uCisgKgorICogcmV0dXJucyAxIGlmIHZhbGlkIG9yIDAgb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludAoreG1sVmFsaWRhdGVOYW1lc1ZhbHVlSW50ZXJuYWwoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqdmFsdWUpIHsKICAgICBjb25zdCB4bWxDaGFyICpjdXI7CiAgICAgaW50IHZhbCwgbGVuOwogCkBAIC0zNDYzLDIyICszNTkwLDM2IEBACiAgICAgY3VyID0gdmFsdWU7CiAgICAgdmFsID0geG1sU3RyaW5nQ3VycmVudENoYXIoTlVMTCwgY3VyLCAmbGVuKTsKICAgICBjdXIgKz0gbGVuOwotICAgIGlmICghSVNfTEVUVEVSKHZhbCkgJiYgKHZhbCAhPSAnXycpICYmCi0gICAgICAgICh2YWwgIT0gJzonKSkgeworCisgICAgaWYgKCF4bWxJc0RvY05hbWVTdGFydENoYXIoZG9jLCB2YWwpKQogCXJldHVybigwKTsKLSAgICB9CiAKICAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogICAgIGN1ciArPSBsZW47Ci0gICAgd2hpbGUgKChJU19MRVRURVIodmFsKSkgfHwgKElTX0RJR0lUKHZhbCkpIHx8Ci0gICAgICAgICAgICh2YWwgPT0gJy4nKSB8fCAodmFsID09ICctJykgfHwKLQkgICAodmFsID09ICdfJykgfHwgKHZhbCA9PSAnOicpIHx8IAotCSAgIChJU19DT01CSU5JTkcodmFsKSkgfHwKLQkgICAoSVNfRVhURU5ERVIodmFsKSkpIHsKKyAgICB3aGlsZSAoeG1sSXNEb2NOYW1lQ2hhcihkb2MsIHZhbCkpIHsKIAl2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogCWN1ciArPSBsZW47CiAgICAgfQogCisgICAgLyogU2hvdWxkIG5vdCB0ZXN0IElTX0JMQU5LKHZhbCkgaGVyZSAtLSBzZWUgZXJyYXR1bSBFMjAqLworICAgIHdoaWxlICh2YWwgPT0gMHgyMCkgeworCXdoaWxlICh2YWwgPT0gMHgyMCkgeworCSAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOworCSAgICBjdXIgKz0gbGVuOworCX0KKworCWlmICgheG1sSXNEb2NOYW1lU3RhcnRDaGFyKGRvYywgdmFsKSkKKwkgICAgcmV0dXJuKDApOworCisJdmFsID0geG1sU3RyaW5nQ3VycmVudENoYXIoTlVMTCwgY3VyLCAmbGVuKTsKKwljdXIgKz0gbGVuOworCisJd2hpbGUgKHhtbElzRG9jTmFtZUNoYXIoZG9jLCB2YWwpKSB7CisJICAgIHZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CisJICAgIGN1ciArPSBsZW47CisJfQorICAgIH0KKwogICAgIGlmICh2YWwgIT0gMCkgcmV0dXJuKDApOwogCiAgICAgcmV0dXJuKDEpOwpAQCAtMzQ5NSw2ICszNjM2LDIzIEBACiAKIGludAogeG1sVmFsaWRhdGVOYW1lc1ZhbHVlKGNvbnN0IHhtbENoYXIgKnZhbHVlKSB7CisgICAgcmV0dXJuKHhtbFZhbGlkYXRlTmFtZXNWYWx1ZUludGVybmFsKE5VTEwsIHZhbHVlKSk7Cit9CisKKy8qKgorICogeG1sVmFsaWRhdGVObXRva2VuVmFsdWVJbnRlcm5hbDoKKyAqIEBkb2M6ICBwb2ludGVyIHRvIHRoZSBkb2N1bWVudCBvciBOVUxMCisgKiBAdmFsdWU6ICBhbiBObXRva2VuIHZhbHVlCisgKgorICogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgbWF0Y2ggTm10b2tlbiBwcm9kdWN0aW9uCisgKgorICogWyBWQzogTmFtZSBUb2tlbiBdCisgKgorICogcmV0dXJucyAxIGlmIHZhbGlkIG9yIDAgb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludAoreG1sVmFsaWRhdGVObXRva2VuVmFsdWVJbnRlcm5hbCh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICp2YWx1ZSkgewogICAgIGNvbnN0IHhtbENoYXIgKmN1cjsKICAgICBpbnQgdmFsLCBsZW47CiAKQEAgLTM1MDIsNDcgKzM2NjAsMTcgQEAKICAgICBjdXIgPSB2YWx1ZTsKICAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogICAgIGN1ciArPSBsZW47Ci0gICAgCi0gICAgaWYgKCFJU19MRVRURVIodmFsKSAmJiAodmFsICE9ICdfJykgJiYKLSAgICAgICAgKHZhbCAhPSAnOicpKSB7CisKKyAgICBpZiAoIXhtbElzRG9jTmFtZUNoYXIoZG9jLCB2YWwpKQogCXJldHVybigwKTsKLSAgICB9CiAKICAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogICAgIGN1ciArPSBsZW47Ci0gICAgd2hpbGUgKChJU19MRVRURVIodmFsKSkgfHwgKElTX0RJR0lUKHZhbCkpIHx8Ci0gICAgICAgICAgICh2YWwgPT0gJy4nKSB8fCAodmFsID09ICctJykgfHwKLQkgICAodmFsID09ICdfJykgfHwgKHZhbCA9PSAnOicpIHx8IAotCSAgIChJU19DT01CSU5JTkcodmFsKSkgfHwKLQkgICAoSVNfRVhURU5ERVIodmFsKSkpIHsKKyAgICB3aGlsZSAoeG1sSXNEb2NOYW1lQ2hhcihkb2MsIHZhbCkpIHsKIAl2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogCWN1ciArPSBsZW47CiAgICAgfQogCi0gICAgLyogU2hvdWxkIG5vdCB0ZXN0IElTX0JMQU5LKHZhbCkgaGVyZSAtLSBzZWUgZXJyYXR1bSBFMjAqLwotICAgIHdoaWxlICh2YWwgPT0gMHgyMCkgewotCXdoaWxlICh2YWwgPT0gMHgyMCkgewotCSAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotCSAgICBjdXIgKz0gbGVuOwotCX0KLQotCWlmICghSVNfTEVUVEVSKHZhbCkgJiYgKHZhbCAhPSAnXycpICYmCi0JICAgICh2YWwgIT0gJzonKSkgewotCSAgICByZXR1cm4oMCk7Ci0JfQotCXZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7Ci0JY3VyICs9IGxlbjsKLQotCXdoaWxlICgoSVNfTEVUVEVSKHZhbCkpIHx8IChJU19ESUdJVCh2YWwpKSB8fAotCSAgICAgICAodmFsID09ICcuJykgfHwgKHZhbCA9PSAnLScpIHx8Ci0JICAgICAgICh2YWwgPT0gJ18nKSB8fCAodmFsID09ICc6JykgfHwgCi0JICAgICAgIChJU19DT01CSU5JTkcodmFsKSkgfHwKLQkgICAgICAgKElTX0VYVEVOREVSKHZhbCkpKSB7Ci0JICAgIHZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7Ci0JICAgIGN1ciArPSBsZW47Ci0JfQotICAgIH0KLQogICAgIGlmICh2YWwgIT0gMCkgcmV0dXJuKDApOwogCiAgICAgcmV0dXJuKDEpOwpAQCAtMzU1NSwxMiArMzY4MywyOSBAQAogICogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgbWF0Y2ggTm10b2tlbiBwcm9kdWN0aW9uCiAgKgogICogWyBWQzogTmFtZSBUb2tlbiBdCi0gKiAKKyAqCiAgKiByZXR1cm5zIDEgaWYgdmFsaWQgb3IgMCBvdGhlcndpc2UKICAqLwogCiBpbnQKIHhtbFZhbGlkYXRlTm10b2tlblZhbHVlKGNvbnN0IHhtbENoYXIgKnZhbHVlKSB7CisgICAgcmV0dXJuKHhtbFZhbGlkYXRlTm10b2tlblZhbHVlSW50ZXJuYWwoTlVMTCwgdmFsdWUpKTsKK30KKworLyoqCisgKiB4bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWVJbnRlcm5hbDoKKyAqIEBkb2M6ICBwb2ludGVyIHRvIHRoZSBkb2N1bWVudCBvciBOVUxMCisgKiBAdmFsdWU6ICBhbiBObXRva2VucyB2YWx1ZQorICoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIG1hdGNoIE5tdG9rZW5zIHByb2R1Y3Rpb24KKyAqCisgKiBbIFZDOiBOYW1lIFRva2VuIF0KKyAqCisgKiByZXR1cm5zIDEgaWYgdmFsaWQgb3IgMCBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50Cit4bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWVJbnRlcm5hbCh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICp2YWx1ZSkgewogICAgIGNvbnN0IHhtbENoYXIgKmN1cjsKICAgICBpbnQgdmFsLCBsZW47CiAKQEAgLTM1NjgsMjMgKzM3MTMsNDAgQEAKICAgICBjdXIgPSB2YWx1ZTsKICAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwogICAgIGN1ciArPSBsZW47Ci0gICAgCi0gICAgaWYgKCFJU19MRVRURVIodmFsKSAmJiAhSVNfRElHSVQodmFsKSAmJgotICAgICAgICAodmFsICE9ICcuJykgJiYgKHZhbCAhPSAnLScpICYmCi0gICAgICAgICh2YWwgIT0gJ18nKSAmJiAodmFsICE9ICc6JykgJiYgCi0gICAgICAgICghSVNfQ09NQklOSU5HKHZhbCkpICYmCi0gICAgICAgICghSVNfRVhURU5ERVIodmFsKSkpCi0JcmV0dXJuKDApOwogCi0gICAgd2hpbGUgKChJU19MRVRURVIodmFsKSkgfHwgKElTX0RJR0lUKHZhbCkpIHx8Ci0gICAgICAgICAgICh2YWwgPT0gJy4nKSB8fCAodmFsID09ICctJykgfHwKLQkgICAodmFsID09ICdfJykgfHwgKHZhbCA9PSAnOicpIHx8IAotCSAgIChJU19DT01CSU5JTkcodmFsKSkgfHwKLQkgICAoSVNfRVhURU5ERVIodmFsKSkpIHsKKyAgICB3aGlsZSAoSVNfQkxBTksodmFsKSkgewogCXZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CiAJY3VyICs9IGxlbjsKICAgICB9CiAKKyAgICBpZiAoIXhtbElzRG9jTmFtZUNoYXIoZG9jLCB2YWwpKQorCXJldHVybigwKTsKKworICAgIHdoaWxlICh4bWxJc0RvY05hbWVDaGFyKGRvYywgdmFsKSkgeworCXZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CisJY3VyICs9IGxlbjsKKyAgICB9CisKKyAgICAvKiBTaG91bGQgbm90IHRlc3QgSVNfQkxBTksodmFsKSBoZXJlIC0tIHNlZSBlcnJhdHVtIEUyMCovCisgICAgd2hpbGUgKHZhbCA9PSAweDIwKSB7CisJd2hpbGUgKHZhbCA9PSAweDIwKSB7CisJICAgIHZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CisJICAgIGN1ciArPSBsZW47CisJfQorCWlmICh2YWwgPT0gMCkgcmV0dXJuKDEpOworCisJaWYgKCF4bWxJc0RvY05hbWVDaGFyKGRvYywgdmFsKSkKKwkgICAgcmV0dXJuKDApOworCisJdmFsID0geG1sU3RyaW5nQ3VycmVudENoYXIoTlVMTCwgY3VyLCAmbGVuKTsKKwljdXIgKz0gbGVuOworCisJd2hpbGUgKHhtbElzRG9jTmFtZUNoYXIoZG9jLCB2YWwpKSB7CisJICAgIHZhbCA9IHhtbFN0cmluZ0N1cnJlbnRDaGFyKE5VTEwsIGN1ciwgJmxlbik7CisJICAgIGN1ciArPSBsZW47CisJfQorICAgIH0KKwogICAgIGlmICh2YWwgIT0gMCkgcmV0dXJuKDApOwogCiAgICAgcmV0dXJuKDEpOwpAQCAtMzU5Nyw2OSArMzc1OSwxMyBAQAogICogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgbWF0Y2ggTm10b2tlbnMgcHJvZHVjdGlvbgogICoKICAqIFsgVkM6IE5hbWUgVG9rZW4gXQotICogCisgKgogICogcmV0dXJucyAxIGlmIHZhbGlkIG9yIDAgb3RoZXJ3aXNlCiAgKi8KIAogaW50CiB4bWxWYWxpZGF0ZU5tdG9rZW5zVmFsdWUoY29uc3QgeG1sQ2hhciAqdmFsdWUpIHsKLSAgICBjb25zdCB4bWxDaGFyICpjdXI7Ci0gICAgaW50IHZhbCwgbGVuOwotCi0gICAgaWYgKHZhbHVlID09IE5VTEwpIHJldHVybigwKTsKLSAgICBjdXIgPSB2YWx1ZTsKLSAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotICAgIGN1ciArPSBsZW47Ci0gICAgCi0gICAgd2hpbGUgKElTX0JMQU5LKHZhbCkpIHsKLQl2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotCWN1ciArPSBsZW47Ci0gICAgfQotCi0gICAgaWYgKCFJU19MRVRURVIodmFsKSAmJiAhSVNfRElHSVQodmFsKSAmJgotICAgICAgICAodmFsICE9ICcuJykgJiYgKHZhbCAhPSAnLScpICYmCi0gICAgICAgICh2YWwgIT0gJ18nKSAmJiAodmFsICE9ICc6JykgJiYgCi0gICAgICAgICghSVNfQ09NQklOSU5HKHZhbCkpICYmCi0gICAgICAgICghSVNfRVhURU5ERVIodmFsKSkpCi0JcmV0dXJuKDApOwotCi0gICAgd2hpbGUgKChJU19MRVRURVIodmFsKSkgfHwgKElTX0RJR0lUKHZhbCkpIHx8Ci0gICAgICAgICAgICh2YWwgPT0gJy4nKSB8fCAodmFsID09ICctJykgfHwKLQkgICAodmFsID09ICdfJykgfHwgKHZhbCA9PSAnOicpIHx8IAotCSAgIChJU19DT01CSU5JTkcodmFsKSkgfHwKLQkgICAoSVNfRVhURU5ERVIodmFsKSkpIHsKLQl2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotCWN1ciArPSBsZW47Ci0gICAgfQotCi0gICAgLyogU2hvdWxkIG5vdCB0ZXN0IElTX0JMQU5LKHZhbCkgaGVyZSAtLSBzZWUgZXJyYXR1bSBFMjAqLwotICAgIHdoaWxlICh2YWwgPT0gMHgyMCkgewotCXdoaWxlICh2YWwgPT0gMHgyMCkgewotCSAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotCSAgICBjdXIgKz0gbGVuOwotCX0KLQlpZiAodmFsID09IDApIHJldHVybigxKTsKLQotCWlmICghSVNfTEVUVEVSKHZhbCkgJiYgIUlTX0RJR0lUKHZhbCkgJiYKLQkgICAgKHZhbCAhPSAnLicpICYmICh2YWwgIT0gJy0nKSAmJgotCSAgICAodmFsICE9ICdfJykgJiYgKHZhbCAhPSAnOicpICYmIAotCSAgICAoIUlTX0NPTUJJTklORyh2YWwpKSAmJgotCSAgICAoIUlTX0VYVEVOREVSKHZhbCkpKQotCSAgICByZXR1cm4oMCk7Ci0KLQl3aGlsZSAoKElTX0xFVFRFUih2YWwpKSB8fCAoSVNfRElHSVQodmFsKSkgfHwKLQkgICAgICAgKHZhbCA9PSAnLicpIHx8ICh2YWwgPT0gJy0nKSB8fAotCSAgICAgICAodmFsID09ICdfJykgfHwgKHZhbCA9PSAnOicpIHx8IAotCSAgICAgICAoSVNfQ09NQklOSU5HKHZhbCkpIHx8Ci0JICAgICAgIChJU19FWFRFTkRFUih2YWwpKSkgewotCSAgICB2YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBjdXIsICZsZW4pOwotCSAgICBjdXIgKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAodmFsICE9IDApIHJldHVybigwKTsKLQotICAgIHJldHVybigxKTsKKyAgICByZXR1cm4oeG1sVmFsaWRhdGVObXRva2Vuc1ZhbHVlSW50ZXJuYWwoTlVMTCwgdmFsdWUpKTsKIH0KIAogLyoqCkBAIC0zNjg2LDYgKzM3OTIsNDAgQEAKIH0KIAogLyoqCisgKiB4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlSW50ZXJuYWw6CisgKiBAZG9jOiB0aGUgZG9jdW1lbnQKKyAqIEB0eXBlOiAgYW4gYXR0cmlidXRlIHR5cGUKKyAqIEB2YWx1ZTogIGFuIGF0dHJpYnV0ZSB2YWx1ZQorICoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBtYXRjaCAgdGhlIHByb3BlciBwcm9kdWN0aW9uCisgKgorICogcmV0dXJucyAxIGlmIHZhbGlkIG9yIDAgb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludAoreG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZUludGVybmFsKHhtbERvY1B0ciBkb2MsIHhtbEF0dHJpYnV0ZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworCWNhc2UgWE1MX0FUVFJJQlVURV9FTlRJVElFUzoKKwljYXNlIFhNTF9BVFRSSUJVVEVfSURSRUZTOgorCSAgICByZXR1cm4oeG1sVmFsaWRhdGVOYW1lc1ZhbHVlSW50ZXJuYWwoZG9jLCB2YWx1ZSkpOworCWNhc2UgWE1MX0FUVFJJQlVURV9FTlRJVFk6CisJY2FzZSBYTUxfQVRUUklCVVRFX0lEUkVGOgorCWNhc2UgWE1MX0FUVFJJQlVURV9JRDoKKwljYXNlIFhNTF9BVFRSSUJVVEVfTk9UQVRJT046CisJICAgIHJldHVybih4bWxWYWxpZGF0ZU5hbWVWYWx1ZUludGVybmFsKGRvYywgdmFsdWUpKTsKKwljYXNlIFhNTF9BVFRSSUJVVEVfTk1UT0tFTlM6CisJY2FzZSBYTUxfQVRUUklCVVRFX0VOVU1FUkFUSU9OOgorCSAgICByZXR1cm4oeG1sVmFsaWRhdGVObXRva2Vuc1ZhbHVlSW50ZXJuYWwoZG9jLCB2YWx1ZSkpOworCWNhc2UgWE1MX0FUVFJJQlVURV9OTVRPS0VOOgorCSAgICByZXR1cm4oeG1sVmFsaWRhdGVObXRva2VuVmFsdWVJbnRlcm5hbChkb2MsIHZhbHVlKSk7CisgICAgICAgIGNhc2UgWE1MX0FUVFJJQlVURV9DREFUQToKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybigxKTsKK30KKworLyoqCiAgKiB4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlOgogICogQHR5cGU6ICBhbiBhdHRyaWJ1dGUgdHlwZQogICogQHZhbHVlOiAgYW4gYXR0cmlidXRlIHZhbHVlCkBAIC0zNzA5LDI3ICszODQ5LDkgQEAKICAqCiAgKiByZXR1cm5zIDEgaWYgdmFsaWQgb3IgMCBvdGhlcndpc2UKICAqLwotCiBpbnQKIHhtbFZhbGlkYXRlQXR0cmlidXRlVmFsdWUoeG1sQXR0cmlidXRlVHlwZSB0eXBlLCBjb25zdCB4bWxDaGFyICp2YWx1ZSkgewotICAgIHN3aXRjaCAodHlwZSkgewotCWNhc2UgWE1MX0FUVFJJQlVURV9FTlRJVElFUzoKLQljYXNlIFhNTF9BVFRSSUJVVEVfSURSRUZTOgotCSAgICByZXR1cm4oeG1sVmFsaWRhdGVOYW1lc1ZhbHVlKHZhbHVlKSk7Ci0JY2FzZSBYTUxfQVRUUklCVVRFX0VOVElUWToKLQljYXNlIFhNTF9BVFRSSUJVVEVfSURSRUY6Ci0JY2FzZSBYTUxfQVRUUklCVVRFX0lEOgotCWNhc2UgWE1MX0FUVFJJQlVURV9OT1RBVElPTjoKLQkgICAgcmV0dXJuKHhtbFZhbGlkYXRlTmFtZVZhbHVlKHZhbHVlKSk7Ci0JY2FzZSBYTUxfQVRUUklCVVRFX05NVE9LRU5TOgotCWNhc2UgWE1MX0FUVFJJQlVURV9FTlVNRVJBVElPTjoKLQkgICAgcmV0dXJuKHhtbFZhbGlkYXRlTm10b2tlbnNWYWx1ZSh2YWx1ZSkpOwotCWNhc2UgWE1MX0FUVFJJQlVURV9OTVRPS0VOOgotCSAgICByZXR1cm4oeG1sVmFsaWRhdGVObXRva2VuVmFsdWUodmFsdWUpKTsKLSAgICAgICAgY2FzZSBYTUxfQVRUUklCVVRFX0NEQVRBOgotCSAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuKDEpOworICAgIHJldHVybih4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlSW50ZXJuYWwoTlVMTCwgdHlwZSwgdmFsdWUpKTsKIH0KIAogLyoqCkBAIC00MDQ3LDExICs0MTY5LDEyIEBACiAgICAgaW50IHZhbDsKICAgICBDSEVDS19EVEQ7CiAgICAgaWYoYXR0ciA9PSBOVUxMKSByZXR1cm4oMSk7Ci0gICAgCisKICAgICAvKiBBdHRyaWJ1dGUgRGVmYXVsdCBMZWdhbCAqLwogICAgIC8qIEVudW1lcmF0aW9uICovCiAgICAgaWYgKGF0dHItPmRlZmF1bHRWYWx1ZSAhPSBOVUxMKSB7Ci0JdmFsID0geG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZShhdHRyLT5hdHlwZSwgYXR0ci0+ZGVmYXVsdFZhbHVlKTsKKwl2YWwgPSB4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlSW50ZXJuYWwoZG9jLCBhdHRyLT5hdHlwZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci0+ZGVmYXVsdFZhbHVlKTsKIAlpZiAodmFsID09IDApIHsKIAkgICAgeG1sRXJyVmFsaWROb2RlKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCBYTUxfRFREX0FUVFJJQlVURV9ERUZBVUxULAogCSAgICAgICAiU3ludGF4IG9mIGRlZmF1bHQgdmFsdWUgZm9yIGF0dHJpYnV0ZSAlcyBvZiAlcyBpcyBub3QgdmFsaWRcbiIsCkBAIC00MzMyLDcgKzQ0NTUsNyBAQAogICAgIH0KICAgICBhdHRyLT5hdHlwZSA9IGF0dHJEZWNsLT5hdHlwZTsKIAotICAgIHZhbCA9IHhtbFZhbGlkYXRlQXR0cmlidXRlVmFsdWUoYXR0ckRlY2wtPmF0eXBlLCB2YWx1ZSk7CisgICAgdmFsID0geG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZUludGVybmFsKGRvYywgYXR0ckRlY2wtPmF0eXBlLCB2YWx1ZSk7CiAgICAgaWYgKHZhbCA9PSAwKSB7CiAJICAgIHhtbEVyclZhbGlkTm9kZShjdHh0LCBlbGVtLCBYTUxfRFREX0FUVFJJQlVURV9WQUxVRSwKIAkgICAiU3ludGF4IG9mIHZhbHVlIGZvciBhdHRyaWJ1dGUgJXMgb2YgJXMgaXMgbm90IHZhbGlkXG4iLApAQCAtNDUxNyw3ICs0NjQwLDcgQEAKIAlyZXR1cm4oMCk7CiAgICAgfQogCi0gICAgdmFsID0geG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZShhdHRyRGVjbC0+YXR5cGUsIHZhbHVlKTsKKyAgICB2YWwgPSB4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlSW50ZXJuYWwoZG9jLCBhdHRyRGVjbC0+YXR5cGUsIHZhbHVlKTsKICAgICBpZiAodmFsID09IDApIHsKIAlpZiAobnMtPnByZWZpeCAhPSBOVUxMKSB7CiAJICAgIHhtbEVyclZhbGlkTm9kZShjdHh0LCBlbGVtLCBYTUxfRFREX0lOVkFMSURfREVGQVVMVCwKQEAgLTY2NzMsNyArNjc5Niw3IEBACiAgICAgeG1sQXR0cmlidXRlVGFibGVQdHIgdGFibGU7CiAgICAgeG1sRW50aXRpZXNUYWJsZVB0ciBlbnRpdGllczsKIAotICAgIGlmIChkb2MgPT0gTlVMTCkgcmV0dXJuKDApOworICAgIGlmICgoZG9jID09IE5VTEwpIHx8IChjdHh0ID09IE5VTEwpKSByZXR1cm4oMCk7CiAgICAgaWYgKChkb2MtPmludFN1YnNldCA9PSBOVUxMKSAmJiAoZG9jLT5leHRTdWJzZXQgPT0gTlVMTCkpCiAJcmV0dXJuKDApOwogICAgIGN0eHQtPmRvYyA9IGRvYzsKZGlmZiAtLWdpdCBhL3hpbmNsdWRlLmMgYi94aW5jbHVkZS5jCmluZGV4IDMxZWEwMjYuLmFlNDQ5ZjggMTAwNjQ0Ci0tLSBhL3hpbmNsdWRlLmMKKysrIGIveGluY2x1ZGUuYwpAQCAtNDE5LDcgKzQxOSw2IEBACiB4bWxYSW5jbHVkZVBhcnNlRmlsZSh4bWxYSW5jbHVkZUN0eHRQdHIgY3R4dCwgY29uc3QgY2hhciAqVVJMKSB7CiAgICAgeG1sRG9jUHRyIHJldDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIHBjdHh0OwotICAgIGNoYXIgKmRpcmVjdG9yeSA9IE5VTEw7CiAgICAgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXRTdHJlYW07CiAKICAgICB4bWxJbml0UGFyc2VyKCk7CkBAIC00NTYsMTAgKzQ1NSw4IEBACiAKICAgICBpbnB1dFB1c2gocGN0eHQsIGlucHV0U3RyZWFtKTsKIAotICAgIGlmICgocGN0eHQtPmRpcmVjdG9yeSA9PSBOVUxMKSAmJiAoZGlyZWN0b3J5ID09IE5VTEwpKQotICAgICAgICBkaXJlY3RvcnkgPSB4bWxQYXJzZXJHZXREaXJlY3RvcnkoVVJMKTsKLSAgICBpZiAoKHBjdHh0LT5kaXJlY3RvcnkgPT0gTlVMTCkgJiYgKGRpcmVjdG9yeSAhPSBOVUxMKSkKLSAgICAgICAgcGN0eHQtPmRpcmVjdG9yeSA9IChjaGFyICopIHhtbFN0cmR1cCgoeG1sQ2hhciAqKSBkaXJlY3RvcnkpOworICAgIGlmIChwY3R4dC0+ZGlyZWN0b3J5ID09IE5VTEwpCisgICAgICAgIHBjdHh0LT5kaXJlY3RvcnkgPSB4bWxQYXJzZXJHZXREaXJlY3RvcnkoVVJMKTsKIAogICAgIHBjdHh0LT5sb2Fkc3Vic2V0IHw9IFhNTF9ERVRFQ1RfSURTOwogCkBAIC01MTYsOSArNTEzLDggQEAKIAlocmVmID0geG1sU3RyZHVwKEJBRF9DQVNUICIiKTsgLyogQEBAQCBocmVmIGlzIG5vdyBvcHRpb25hbCAqLwogCWlmIChocmVmID09IE5VTEwpIAogCSAgICByZXR1cm4oLTEpOwotCWxvY2FsID0gMTsKICAgICB9Ci0gICAgaWYgKGhyZWZbMF0gPT0gJyMnKQorICAgIGlmICgoaHJlZlswXSA9PSAnIycpIHx8IChocmVmWzBdID09IDApKQogCWxvY2FsID0gMTsKICAgICBwYXJzZSA9IHhtbFhJbmNsdWRlR2V0UHJvcChjdHh0LCBjdXIsIFhJTkNMVURFX1BBUlNFKTsKICAgICBpZiAocGFyc2UgIT0gTlVMTCkgewpAQCAtNjE3LDYgKzYxMywxOSBAQAogICAgIH0KIAogICAgIC8qCisgICAgICogSWYgbG9jYWwgYW5kIHhtbCB0aGVuIHdlIG5lZWQgYSBmcmFnbWVudAorICAgICAqLworICAgIGlmICgobG9jYWwgPT0gMSkgJiYgKHhtbCA9PSAxKSAmJgorICAgICAgICAoKGZyYWdtZW50ID09IE5VTEwpIHx8IChmcmFnbWVudFswXSA9PSAwKSkpIHsKKwl4bWxYSW5jbHVkZUVycihjdHh0LCBjdXIsIFhNTF9YSU5DTFVERV9SRUNVUlNJT04sCisJICAgICAgICAgICAgICAgImRldGVjdGVkIGEgbG9jYWwgcmVjdXJzaW9uIHdpdGggbm8geHBvaW50ZXIgaW4gJXNcbiIsCisJCSAgICAgICBVUkwpOworCWlmIChmcmFnbWVudCAhPSBOVUxMKQorCSAgICB4bWxGcmVlKGZyYWdtZW50KTsKKwlyZXR1cm4oLTEpOworICAgIH0KKworICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIFVSTCBhZ2FpbnN0IHRoZSBzdGFjayBmb3IgcmVjdXJzaW9ucwogICAgICAqLwogICAgIGlmICgoIWxvY2FsKSAmJiAoeG1sID09IDEpKSB7CkBAIC0xNjY5LDcgKzE2NzgsOSBAQAogICAgIC8qCiAgICAgICogRG8gdGhlIHhtbDpiYXNlIGZpeHVwIGlmIG5lZWRlZAogICAgICAqLwotICAgIGlmICgoZG9jICE9IE5VTEwpICYmIChVUkwgIT0gTlVMTCkgJiYgKHhtbFN0cmNocihVUkwsICh4bWxDaGFyKSAnLycpKSkgeworICAgIGlmICgoZG9jICE9IE5VTEwpICYmIChVUkwgIT0gTlVMTCkgJiYgKHhtbFN0cmNocihVUkwsICh4bWxDaGFyKSAnLycpKSAmJgorICAgICAgICAoIShjdHh0LT5wYXJzZUZsYWdzICYgWE1MX1BBUlNFX05PQkFTRUZJWCkpICYmCisJKCEoZG9jLT5wYXJzZUZsYWdzICYgWE1MX1BBUlNFX05PQkFTRUZJWCkpKSB7CiAJeG1sTm9kZVB0ciBub2RlOwogCXhtbENoYXIgKmJhc2U7CiAJeG1sQ2hhciAqY3VyQmFzZTsKZGlmZiAtLWdpdCBhL3htbElPLmMgYi94bWxJTy5jCmluZGV4IDc3ODI3NzYuLmQ0ZGMzNjQgMTAwNjQ0Ci0tLSBhL3htbElPLmMKKysrIGIveG1sSU8uYwpAQCAtMTM1LDYgKzEzNSw5IEBACiBzdGF0aWMgeG1sT3V0cHV0Q2FsbGJhY2sgeG1sT3V0cHV0Q2FsbGJhY2tUYWJsZVtNQVhfT1VUUFVUX0NBTExCQUNLXTsKIHN0YXRpYyBpbnQgeG1sT3V0cHV0Q2FsbGJhY2tOciA9IDA7CiBzdGF0aWMgaW50IHhtbE91dHB1dENhbGxiYWNrSW5pdGlhbGl6ZWQgPSAwOworCit4bWxPdXRwdXRCdWZmZXJQdHIKK3htbEFsbG9jT3V0cHV0QnVmZmVySW50ZXJuYWwoeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBlbmNvZGVyKTsKICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTcyMCw3ICsxNzIzLDcgQEAKICAgICB7CiAgICAgICAgIC8qICBBbnkgY2hhcmFjdGVyIGNvbnZlcnNpb25zIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBiZWZvcmUgdGhpcyAgKi8KIAotICAgICAgICBjdHh0LT5kb2NfYnVmZiA9IHhtbEFsbG9jT3V0cHV0QnVmZmVyKE5VTEwpOworICAgICAgICBjdHh0LT5kb2NfYnVmZiA9IHhtbEFsbG9jT3V0cHV0QnVmZmVySW50ZXJuYWwoTlVMTCk7CiAgICAgfQogCiAgICAgaWYgKGN0eHQtPmRvY19idWZmID09IE5VTEwpIHsKQEAgLTE3MzEsNyArMTczNCw3IEBACiAgICAgcmV0dXJuIChjdHh0KTsKIH0KICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KLQkJCQkKKwogI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAogLyoqCiAgKiB4bWxJT0hUVFBEZmx0T3BlblcKQEAgLTIyNzQsMTAgKzIyNzcsMTUgQEAKICAgICAgICAgeG1sRnJlZShyZXQpOwogCXJldHVybihOVUxMKTsKICAgICB9Ci0gICAgcmV0LT5idWZmZXItPmFsbG9jID0gWE1MX0JVRkZFUl9BTExPQ19ET1VCTEVJVDsKKwogICAgIHJldC0+ZW5jb2RlciA9IGVuY29kZXI7CiAgICAgaWYgKGVuY29kZXIgIT0gTlVMTCkgewogICAgICAgICByZXQtPmNvbnYgPSB4bWxCdWZmZXJDcmVhdGVTaXplKDQwMDApOworCWlmIChyZXQtPmNvbnYgPT0gTlVMTCkgeworCSAgICB4bWxGcmVlKHJldCk7CisJICAgIHJldHVybihOVUxMKTsKKwl9CisKIAkvKgogCSAqIFRoaXMgY2FsbCBpcyBkZXNpZ25lZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBzdGF0ZQogCSAqLwpAQCAtMjI5MSw2ICsyMjk5LDYyIEBACiAKICAgICByZXR1cm4ocmV0KTsKIH0KKworLyoqCisgKiB4bWxBbGxvY091dHB1dEJ1ZmZlckludGVybmFsOgorICogQGVuY29kZXI6ICB0aGUgZW5jb2RpbmcgY29udmVydGVyIG9yIE5VTEwKKyAqCisgKiBDcmVhdGUgYSBidWZmZXJlZCBwYXJzZXIgb3V0cHV0CisgKgorICogUmV0dXJucyB0aGUgbmV3IHBhcnNlciBvdXRwdXQgb3IgTlVMTAorICovCit4bWxPdXRwdXRCdWZmZXJQdHIKK3htbEFsbG9jT3V0cHV0QnVmZmVySW50ZXJuYWwoeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBlbmNvZGVyKSB7CisgICAgeG1sT3V0cHV0QnVmZmVyUHRyIHJldDsKKworICAgIHJldCA9ICh4bWxPdXRwdXRCdWZmZXJQdHIpIHhtbE1hbGxvYyhzaXplb2YoeG1sT3V0cHV0QnVmZmVyKSk7CisgICAgaWYgKHJldCA9PSBOVUxMKSB7CisJeG1sSU9FcnJNZW1vcnkoImNyZWF0aW5nIG91dHB1dCBidWZmZXIiKTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorICAgIG1lbXNldChyZXQsIDAsIChzaXplX3QpIHNpemVvZih4bWxPdXRwdXRCdWZmZXIpKTsKKyAgICByZXQtPmJ1ZmZlciA9IHhtbEJ1ZmZlckNyZWF0ZSgpOworICAgIGlmIChyZXQtPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHhtbEZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIEZvciBjb252ZXJzaW9uIGJ1ZmZlcnMgd2UgdXNlIHRoZSBzcGVjaWFsIElPIGhhbmRsaW5nCisgICAgICogV2UgZG9uJ3QgZG8gdGhhdCBmcm9tIHRoZSBleHBvcnRlZCBBUEkgdG8gYXZvaWQgY29uZnVzaW5nCisgICAgICogdXNlcidzIGNvZGUuCisgICAgICovCisgICAgcmV0LT5idWZmZXItPmFsbG9jID0gWE1MX0JVRkZFUl9BTExPQ19JTzsKKyAgICByZXQtPmJ1ZmZlci0+Y29udGVudElPID0gcmV0LT5idWZmZXItPmNvbnRlbnQ7CisKKyAgICByZXQtPmVuY29kZXIgPSBlbmNvZGVyOworICAgIGlmIChlbmNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0LT5jb252ID0geG1sQnVmZmVyQ3JlYXRlU2l6ZSg0MDAwKTsKKwlpZiAocmV0LT5jb252ID09IE5VTEwpIHsKKwkgICAgeG1sRnJlZShyZXQpOworCSAgICByZXR1cm4oTlVMTCk7CisJfQorCisJLyoKKwkgKiBUaGlzIGNhbGwgaXMgZGVzaWduZWQgdG8gaW5pdGlhdGUgdGhlIGVuY29kZXIgc3RhdGUKKwkgKi8KKwl4bWxDaGFyRW5jT3V0RnVuYyhlbmNvZGVyLCByZXQtPmNvbnYsIE5VTEwpOyAKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0LT5jb252ID0gTlVMTDsKKyAgICByZXQtPndyaXRlY2FsbGJhY2sgPSBOVUxMOworICAgIHJldC0+Y2xvc2VjYWxsYmFjayA9IE5VTEw7CisgICAgcmV0LT5jb250ZXh0ID0gTlVMTDsKKyAgICByZXQtPndyaXR0ZW4gPSAwOworCisgICAgcmV0dXJuKHJldCk7Cit9CisKICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KIAogLyoqCkBAIC0yNDkxLDcgKzI1NTUsNyBAQAogCWlmICgoY29tcHJlc3Npb24gPiAwKSAmJiAoY29tcHJlc3Npb24gPD0gOSkgJiYgKGlzX2ZpbGVfdXJpID09IDEpKSB7CiAJICAgIGNvbnRleHQgPSB4bWxHemZpbGVPcGVuVyh1bmVzY2FwZWQsIGNvbXByZXNzaW9uKTsKIAkgICAgaWYgKGNvbnRleHQgIT0gTlVMTCkgewotCQlyZXQgPSB4bWxBbGxvY091dHB1dEJ1ZmZlcihlbmNvZGVyKTsKKwkJcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChlbmNvZGVyKTsKIAkJaWYgKHJldCAhPSBOVUxMKSB7CiAJCSAgICByZXQtPmNvbnRleHQgPSBjb250ZXh0OwogCQkgICAgcmV0LT53cml0ZWNhbGxiYWNrID0geG1sR3pmaWxlV3JpdGU7CkBAIC0yNTI4LDcgKzI1OTIsNyBAQAogCWlmICgoY29tcHJlc3Npb24gPiAwKSAmJiAoY29tcHJlc3Npb24gPD0gOSkgJiYgKGlzX2ZpbGVfdXJpID09IDEpKSB7CiAJICAgIGNvbnRleHQgPSB4bWxHemZpbGVPcGVuVyhVUkksIGNvbXByZXNzaW9uKTsKIAkgICAgaWYgKGNvbnRleHQgIT0gTlVMTCkgewotCQlyZXQgPSB4bWxBbGxvY091dHB1dEJ1ZmZlcihlbmNvZGVyKTsKKwkJcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChlbmNvZGVyKTsKIAkJaWYgKHJldCAhPSBOVUxMKSB7CiAJCSAgICByZXQtPmNvbnRleHQgPSBjb250ZXh0OwogCQkgICAgcmV0LT53cml0ZWNhbGxiYWNrID0geG1sR3pmaWxlV3JpdGU7CkBAIC0yNTYxLDcgKzI2MjUsNyBAQAogICAgIC8qCiAgICAgICogQWxsb2NhdGUgdGhlIE91dHB1dCBidWZmZXIgZnJvbnQtZW5kLgogICAgICAqLwotICAgIHJldCA9IHhtbEFsbG9jT3V0cHV0QnVmZmVyKGVuY29kZXIpOworICAgIHJldCA9IHhtbEFsbG9jT3V0cHV0QnVmZmVySW50ZXJuYWwoZW5jb2Rlcik7CiAgICAgaWYgKHJldCAhPSBOVUxMKSB7CiAJcmV0LT5jb250ZXh0ID0gY29udGV4dDsKIAlyZXQtPndyaXRlY2FsbGJhY2sgPSB4bWxPdXRwdXRDYWxsYmFja1RhYmxlW2ldLndyaXRlY2FsbGJhY2s7CkBAIC0yNjQ1LDcgKzI3MDksNyBAQAogCiAgICAgaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogCi0gICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoZW5jb2Rlcik7CisgICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChlbmNvZGVyKTsKICAgICBpZiAocmV0ICE9IE5VTEwpIHsKICAgICAgICAgcmV0LT5jb250ZXh0ID0gZmlsZTsKIAlyZXQtPndyaXRlY2FsbGJhY2sgPSB4bWxGaWxlV3JpdGU7CkBAIC0yODAzLDcgKzI4NjcsNyBAQAogCiAgICAgaWYgKGZkIDwgMCkgcmV0dXJuKE5VTEwpOwogCi0gICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoZW5jb2Rlcik7CisgICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChlbmNvZGVyKTsKICAgICBpZiAocmV0ICE9IE5VTEwpIHsKICAgICAgICAgcmV0LT5jb250ZXh0ID0gKHZvaWQgKikgKGxvbmcpIGZkOwogCXJldC0+d3JpdGVjYWxsYmFjayA9IHhtbEZkV3JpdGU7CkBAIC0yODY0LDcgKzI5MjgsNyBAQAogCiAgICAgaWYgKGlvd3JpdGUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogCi0gICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoZW5jb2Rlcik7CisgICAgcmV0ID0geG1sQWxsb2NPdXRwdXRCdWZmZXJJbnRlcm5hbChlbmNvZGVyKTsKICAgICBpZiAocmV0ICE9IE5VTEwpIHsKICAgICAgICAgcmV0LT5jb250ZXh0ID0gKHZvaWQgKikgaW9jdHg7CiAJcmV0LT53cml0ZWNhbGxiYWNrID0gaW93cml0ZTsKQEAgLTMzMTUsNiArMzM3OSwxNyBAQAogCWNvbnMgPSBsZW47CiAJY2h1bmsgPSAob3V0LT5idWZmZXItPnNpemUgLSBvdXQtPmJ1ZmZlci0+dXNlKSAtIDE7CiAKKyAgICAgICAgLyoKKwkgKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggcm9vbSB0byBzYXZlIGZpcnN0LCBpZiB0aGlzIGlzCisJICogbm90IHRoZSBjYXNlIGZvcmNlIGEgZmx1c2gsIGJ1dCBtYWtlIHN1cmUgd2Ugc3RheSBpbiB0aGUgbG9vcAorCSAqLworCWlmIChjaHVuayA8IDQwKSB7CisJICAgIGlmICh4bWxCdWZmZXJHcm93KG91dC0+YnVmZmVyLCBvdXQtPmJ1ZmZlci0+c2l6ZSArIDEwMCkgPCAwKQorCSAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgIG9sZHdyaXR0ZW4gPSAtMTsKKwkgICAgY29udGludWU7CisJfQorCiAJLyoKIAkgKiBmaXJzdCBoYW5kbGUgZW5jb2Rpbmcgc3R1ZmYuCiAJICovCmRpZmYgLS1naXQgYS94bWxsaW50LmMgYi94bWxsaW50LmMKaW5kZXggZWU0MTY5Ny4uNzdjMWU2MiAxMDA2NDQKLS0tIGEveG1sbGludC5jCisrKyBiL3htbGxpbnQuYwpAQCAtMjAyLDYgKzIwMiw3IEBACiAjZW5kaWYKIHN0YXRpYyBpbnQgb3B0aW9ucyA9IFhNTF9QQVJTRV9DT01QQUNUOwogc3RhdGljIGludCBzYXggPSAwOworc3RhdGljIGludCBvbGR4bWwxMCA9IDA7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgpAQCAtMjc1Miw5ICsyNzUzLDExIEBACiAjZW5kaWYKIAogI2lmZGVmIExJQlhNTF9ERUJVR19FTkFCTEVECisjaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgIGlmICgoZGVidWdlbnQpICYmICghaHRtbCkpCiAJeG1sRGVidWdEdW1wRW50aXRpZXMoc3RkZXJyLCBkb2MpOwogI2VuZGlmCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogZnJlZSBpdC4KQEAgLTI4MzIsNiArMjgzNSw3IEBACiAgICAgcHJpbnRmKCJcdC0tY29weSA6IHVzZWQgdG8gdGVzdCB0aGUgaW50ZXJuYWwgY29weSBpbXBsZW1lbnRhdGlvblxuIik7CiAjZW5kaWYgLyogTElCWE1MX1RSRUVfRU5BQkxFRCAqLwogICAgIHByaW50ZigiXHQtLXJlY292ZXIgOiBvdXRwdXQgd2hhdCB3YXMgcGFyc2FibGUgb24gYnJva2VuIFhNTCBkb2N1bWVudHNcbiIpOworICAgIHByaW50ZigiXHQtLWh1Z2UgOiByZW1vdmUgYW55IGludGVybmFsIGFyYml0cmFyeSBwYXJzZXIgbGltaXRzXG4iKTsKICAgICBwcmludGYoIlx0LS1ub2VudCA6IHN1YnN0aXR1dGUgZW50aXR5IHJlZmVyZW5jZXMgYnkgdGhlaXIgdmFsdWVcbiIpOwogICAgIHByaW50ZigiXHQtLW5vb3V0IDogZG9uJ3Qgb3V0cHV0IHRoZSByZXN1bHQgdHJlZVxuIik7CiAgICAgcHJpbnRmKCJcdC0tcGF0aCAncGF0aHMnOiBwcm92aWRlIGEgc2V0IG9mIHBhdGhzIGZvciByZXNvdXJjZXNcbiIpOwpAQCAtMjg5MCw2ICsyODk0LDcgQEAKICNpZmRlZiBMSUJYTUxfWElOQ0xVREVfRU5BQkxFRAogICAgIHByaW50ZigiXHQtLXhpbmNsdWRlIDogZG8gWEluY2x1ZGUgcHJvY2Vzc2luZ1xuIik7CiAgICAgcHJpbnRmKCJcdC0tbm94aW5jbHVkZW5vZGUgOiBzYW1lIGJ1dCBkbyBub3QgZ2VuZXJhdGUgWEluY2x1ZGUgbm9kZXNcbiIpOworICAgIHByaW50ZigiXHQtLW5vZml4dXAtYmFzZS11cmlzIDogZG8gbm90IGZpeHVwIHhtbDpiYXNlIHVyaXNcbiIpOwogI2VuZGlmCiAgICAgcHJpbnRmKCJcdC0tbG9hZGR0ZCA6IGZldGNoIGV4dGVybmFsIERURFxuIik7CiAgICAgcHJpbnRmKCJcdC0tZHRkYXR0ciA6IGxvYWRkdGQgKyBwb3B1bGF0ZSB0aGUgdHJlZSB3aXRoIGluaGVyaXRlZCBhdHRyaWJ1dGVzIFxuIik7CkBAIC0yOTEyLDYgKzI5MTcsNyBAQAogICAgIHByaW50ZigiXHQtLXNheDE6IHVzZSB0aGUgb2xkIFNBWDEgaW50ZXJmYWNlcyBmb3IgcHJvY2Vzc2luZ1xuIik7CiAjZW5kaWYKICAgICBwcmludGYoIlx0LS1zYXg6IGRvIG5vdCBidWlsZCBhIHRyZWUgYnV0IHdvcmsganVzdCBhdCB0aGUgU0FYIGxldmVsXG4iKTsKKyAgICBwcmludGYoIlx0LS1vbGR4bWwxMDogdXNlIFhNTC0xLjAgcGFyc2luZyBydWxlcyBiZWZvcmUgdGhlIDV0aCBlZGl0aW9uXG4iKTsKIAogICAgIHByaW50ZigiXG5MaWJ4bWwgcHJvamVjdCBob21lIHBhZ2U6IGh0dHA6Ly94bWxzb2Z0Lm9yZy9cbiIpOwogICAgIHByaW50ZigiVG8gcmVwb3J0IGJ1Z3Mgb3IgZ2V0IHNvbWUgaGVscCBjaGVjazogaHR0cDovL3htbHNvZnQub3JnL2J1Z3MuaHRtbFxuIik7CkBAIC0yOTY5LDYgKzI5NzUsOSBAQAogCSAgICAgICAgICghc3RyY21wKGFyZ3ZbaV0sICItLXJlY292ZXIiKSkpIHsKIAkgICAgcmVjb3ZlcnkrKzsKIAkgICAgb3B0aW9ucyB8PSBYTUxfUEFSU0VfUkVDT1ZFUjsKKwl9IGVsc2UgaWYgKCghc3RyY21wKGFyZ3ZbaV0sICItaHVnZSIpKSB8fAorCSAgICAgICAgICghc3RyY21wKGFyZ3ZbaV0sICItLWh1Z2UiKSkpIHsKKwkgICAgb3B0aW9ucyB8PSBYTUxfUEFSU0VfSFVHRTsKIAl9IGVsc2UgaWYgKCghc3RyY21wKGFyZ3ZbaV0sICItbm9lbnQiKSkgfHwKIAkgICAgICAgICAoIXN0cmNtcChhcmd2W2ldLCAiLS1ub2VudCIpKSkgewogCSAgICBub2VudCsrOwpAQCAtMzA5MSw2ICszMTAwLDEyIEBACiAJICAgIG9wdGlvbnMgfD0gWE1MX1BBUlNFX1hJTkNMVURFOwogCSAgICBvcHRpb25zIHw9IFhNTF9QQVJTRV9OT1hJTkNOT0RFOwogCX0KKwllbHNlIGlmICgoIXN0cmNtcChhcmd2W2ldLCAiLW5vZml4dXAtYmFzZS11cmlzIikpIHx8CisJICAgICAgICAgKCFzdHJjbXAoYXJndltpXSwgIi0tbm9maXh1cC1iYXNlLXVyaXMiKSkpIHsKKwkgICAgeGluY2x1ZGUrKzsKKwkgICAgb3B0aW9ucyB8PSBYTUxfUEFSU0VfWElOQ0xVREU7CisJICAgIG9wdGlvbnMgfD0gWE1MX1BBUlNFX05PQkFTRUZJWDsKKwl9CiAjZW5kaWYKICNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKICNpZmRlZiBIQVZFX1pMSUJfSApAQCAtMzIzNyw2ICszMjUyLDEwIEBACiAJICAgIGkrKzsKIAkgICAgcGF0dGVybiA9IGFyZ3ZbaV07CiAjZW5kaWYKKwl9IGVsc2UgaWYgKCghc3RyY21wKGFyZ3ZbaV0sICItb2xkeG1sMTAiKSkgfHwKKwkgICAgICAgICAgICghc3RyY21wKGFyZ3ZbaV0sICItLW9sZHhtbDEwIikpKSB7CisJICAgIG9sZHhtbDEwKys7CisJICAgIG9wdGlvbnMgfD0gWE1MX1BBUlNFX09MRDEwOwogCX0gZWxzZSB7CiAJICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gJXNcbiIsIGFyZ3ZbaV0pOwogCSAgICB1c2FnZShhcmd2WzBdKTsKZGlmZiAtLWdpdCBhL3htbG1lbW9yeS5jIGIveG1sbWVtb3J5LmMKaW5kZXggZjkwMTlhNC4uNDMzYWJiOCAxMDA2NDQKLS0tIGEveG1sbWVtb3J5LmMKKysrIGIveG1sbWVtb3J5LmMKQEAgLTM0LDcgKzM0LDcgQEAKIC8qKgogICogTUVNX0xJU1Q6CiAgKgotICoga2VlcCB0cmFjayBvZiBhbGwgYWxsb2NhdGVkIGJsb2NrcyBmb3IgZXJyb3IgcmVwb3J0aW5nIAorICoga2VlcCB0cmFjayBvZiBhbGwgYWxsb2NhdGVkIGJsb2NrcyBmb3IgZXJyb3IgcmVwb3J0aW5nCiAgKiBBbHdheXMgYnVpbGQgdGhlIG1lbW9yeSBsaXN0ICEKICAqLwogI2lmZGVmIERFQlVHX01FTU9SWV9MT0NBVElPTgpAQCAtMTYyLDcgKzE2Miw3IEBACiB7CiAgICAgTUVNSERSICpwOwogICAgIHZvaWQgKnJldDsKLSAgICAKKwogICAgIGlmICgheG1sTWVtSW5pdGlhbGl6ZWQpIHhtbEluaXRNZW1vcnkoKTsKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTE3MCw3ICsxNzAsNyBAQAogI2VuZGlmCiAKICAgICBURVNUX1BPSU5UCi0gICAgCisKICAgICBwID0gKE1FTUhEUiAqKSBtYWxsb2MoUkVTRVJWRV9TSVpFK3NpemUpOwogCiAgICAgaWYgKCFwKSB7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJInhtbE1hbGxvY0xvYyA6IE91dCBvZiBmcmVlIHNwYWNlXG4iKTsKIAl4bWxNZW1vcnlEdW1wKCk7CiAJcmV0dXJuKE5VTEwpOwotICAgIH0gICAKKyAgICB9CiAgICAgcC0+bWhfdGFnID0gTUVNVEFHOwogICAgIHAtPm1oX3NpemUgPSBzaXplOwogICAgIHAtPm1oX3R5cGUgPSBNQUxMT0NfVFlQRTsKQEAgLTE5MywxOSArMTkzLDE5IEBACiAgICAgZGVidWdtZW1fbGlzdF9hZGQocCk7CiAjZW5kaWYKICAgICB4bWxNdXRleFVubG9jayh4bWxNZW1NdXRleCk7Ci0gICAgCisKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkgICAgIk1hbGxvYyglZCkgT2tcbiIsc2l6ZSk7CiAjZW5kaWYKLSAgICAKKwogICAgIGlmICh4bWxNZW1TdG9wQXRCbG9jayA9PSBwLT5taF9udW1iZXIpIHhtbE1hbGxvY0JyZWFrcG9pbnQoKTsKIAogICAgIHJldCA9IEhEUl8yX0NMSUVOVChwKTsKIAogICAgIGlmICh4bWxNZW1UcmFjZUJsb2NrQXQgPT0gcmV0KSB7CiAJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCi0JCQkiJXAgOiBNYWxsb2MoJWQpIE9rXG4iLCB4bWxNZW1UcmFjZUJsb2NrQXQsIHNpemUpOworCQkJIiVwIDogTWFsbG9jKCVsZCkgT2tcbiIsIHhtbE1lbVRyYWNlQmxvY2tBdCwgc2l6ZSk7CiAJeG1sTWFsbG9jQnJlYWtwb2ludCgpOwogICAgIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiB7CiAgICAgTUVNSERSICpwOwogICAgIHZvaWQgKnJldDsKLSAgICAKKwogICAgIGlmICgheG1sTWVtSW5pdGlhbGl6ZWQpIHhtbEluaXRNZW1vcnkoKTsKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKQEAgLTIzOCw3ICsyMzgsNyBAQAogI2VuZGlmCiAKICAgICBURVNUX1BPSU5UCi0gICAgCisKICAgICBwID0gKE1FTUhEUiAqKSBtYWxsb2MoUkVTRVJWRV9TSVpFK3NpemUpOwogCiAgICAgaWYgKCFwKSB7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAkJInhtbE1hbGxvY0xvYyA6IE91dCBvZiBmcmVlIHNwYWNlXG4iKTsKIAl4bWxNZW1vcnlEdW1wKCk7CiAJcmV0dXJuKE5VTEwpOwotICAgIH0gICAKKyAgICB9CiAgICAgcC0+bWhfdGFnID0gTUVNVEFHOwogICAgIHAtPm1oX3NpemUgPSBzaXplOwogICAgIHAtPm1oX3R5cGUgPSBNQUxMT0NfQVRPTUlDX1RZUEU7CkBAIC0yNjYsMTQgKzI2NiwxNCBAQAogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCSAgICAiTWFsbG9jKCVkKSBPa1xuIixzaXplKTsKICNlbmRpZgotICAgIAorCiAgICAgaWYgKHhtbE1lbVN0b3BBdEJsb2NrID09IHAtPm1oX251bWJlcikgeG1sTWFsbG9jQnJlYWtwb2ludCgpOwogCiAgICAgcmV0ID0gSERSXzJfQ0xJRU5UKHApOwogCiAgICAgaWYgKHhtbE1lbVRyYWNlQmxvY2tBdCA9PSByZXQpIHsKIAl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSIlcCA6IE1hbGxvYyglZCkgT2tcbiIsIHhtbE1lbVRyYWNlQmxvY2tBdCwgc2l6ZSk7CisJCQkiJXAgOiBNYWxsb2MoJWxkKSBPa1xuIiwgeG1sTWVtVHJhY2VCbG9ja0F0LCBzaXplKTsKIAl4bWxNYWxsb2NCcmVha3BvaW50KCk7CiAgICAgfQogCkBAIC0zNDEsMTQgKzM0MSwxNCBAQAogICAgIGRlYnVnbWVtX2xpc3RfZGVsZXRlKHApOwogI2VuZGlmCiAgICAgeG1sTXV0ZXhVbmxvY2soeG1sTWVtTXV0ZXgpOwotICAgIAorCiAgICAgcCA9IChNRU1IRFIgKikgcmVhbGxvYyhwLFJFU0VSVkVfU0laRStzaXplKTsKICAgICBpZiAoIXApIHsKIAkgZ290byBlcnJvcjsKICAgICB9CiAgICAgaWYgKHhtbE1lbVRyYWNlQmxvY2tBdCA9PSBwdHIpIHsKIAl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLQkJCSIlcCA6IFJlYWxsb2NlZCglZCAtPiAlZCkgT2tcbiIsCisJCQkiJXAgOiBSZWFsbG9jZWQoJWxkIC0+ICVsZCkgT2tcbiIsCiAJCQl4bWxNZW1UcmFjZUJsb2NrQXQsIHAtPm1oX3NpemUsIHNpemUpOwogCXhtbE1hbGxvY0JyZWFrcG9pbnQoKTsKICAgICB9CkBAIC0zNzQsOCArMzc0LDggQEAKIAkgICAgIlJlYWxsb2NlZCglZCB0byAlZCkgT2tcbiIsIG9sZHNpemUsIHNpemUpOwogI2VuZGlmCiAgICAgcmV0dXJuKEhEUl8yX0NMSUVOVChwKSk7Ci0gICAgCi1lcnJvcjogICAgCisKK2Vycm9yOgogICAgIHJldHVybihOVUxMKTsKIH0KIApAQCAtNDU1LDEwICs0NTUsMTAgQEAKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkgICAgIkZyZWVkKCVkKSBPa1xuIiwgc2l6ZSk7CiAjZW5kaWYKLSAgICAKKwogICAgIHJldHVybjsKLSAgICAKLWVycm9yOiAgICAKKworZXJyb3I6CiAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICJ4bWxNZW1GcmVlKCVsWCkgZXJyb3JcbiIsICh1bnNpZ25lZCBsb25nKSBwdHIpOwogICAgIHhtbE1hbGxvY0JyZWFrcG9pbnQoKTsKQEAgLTUwNCwxNiArNTA0LDE2IEBACiAgICAgZGVidWdtZW1fbGlzdF9hZGQocCk7CiAjZW5kaWYKICAgICB4bWxNdXRleFVubG9jayh4bWxNZW1NdXRleCk7Ci0gICAgCisKICAgICBzID0gKGNoYXIgKikgSERSXzJfQ0xJRU5UKHApOwotICAgIAorCiAgICAgaWYgKHhtbE1lbVN0b3BBdEJsb2NrID09IHAtPm1oX251bWJlcikgeG1sTWFsbG9jQnJlYWtwb2ludCgpOwogCiAgICAgaWYgKHMgIT0gTlVMTCkKICAgICAgIHN0cmNweShzLHN0cik7CiAgICAgZWxzZQogICAgICAgZ290byBlcnJvcjsKLSAgICAKKwogICAgIFRFU1RfUE9JTlQKIAogICAgIGlmICh4bWxNZW1UcmFjZUJsb2NrQXQgPT0gcykgewpAQCAtNjE3LDcgKzYxNyw3IEBACiAgICAgfSBlbHNlIGlmICgoaSA9PSAwKSAmJiAoYnVmW2ldID09IDApKSB7CiAgICAgICAgIGZwcmludGYoZnAsIiBudWxsIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJ1ZltpXSA9PSAwKSBmcHJpbnRmKGZwLCIgXCIlLjI1c1wiIiwgYnVmKTsgCisgICAgICAgIGlmIChidWZbaV0gPT0gMCkgZnByaW50ZihmcCwiIFwiJS4yNXNcIiIsIGJ1Zik7CiAJZWxzZSB7CiAgICAgICAgICAgICBmcHJpbnRmKGZwLCIgWyIpOwogCSAgICBmb3IgKGogPSAwO2ogPCBpO2orKykKQEAgLTYyOSw2ICs2MjksNzkgQEAKICNlbmRpZgogCiAvKioKKyAqIHhtbE1lbURpc3BsYXlMYXN0OgorICogQGZwOiAgYSBGSUxFIGRlc2NyaXB0b3IgdXNlZCBhcyB0aGUgb3V0cHV0IGZpbGUsIGlmIE5VTEwsIHRoZSByZXN1bHQgaXMKKyAqICAgICAgIHdyaXR0ZW4gdG8gdGhlIGZpbGUgLm1lbW9yeWxpc3QKKyAqIEBuYkJ5dGVzOiB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byBkdW1wCisgKgorICogdGhlIGxhc3QgbmJCeXRlcyBvZiBtZW1vcnkgYWxsb2NhdGVkIGFuZCBub3QgZnJlZWQsIHVzZWZ1bCBmb3IgZHVtcGluZworICogdGhlIG1lbW9yeSBsZWZ0IGFsbG9jYXRlZCBiZXR3ZWVuIHR3byBwbGFjZXMgYXQgcnVudGltZS4KKyAqLworCit2b2lkCit4bWxNZW1EaXNwbGF5TGFzdChGSUxFICpmcCwgbG9uZyBuYkJ5dGVzKQoreworI2lmZGVmIE1FTV9MSVNUCisgICAgTUVNSERSICpwOworICAgIHVuc2lnbmVkIGlkeDsKKyAgICBpbnQgICAgIG5iID0gMDsKKyNlbmRpZgorICAgIEZJTEUgKm9sZF9mcCA9IGZwOworCisgICAgaWYgKG5iQnl0ZXMgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZwID09IE5VTEwpIHsKKwlmcCA9IGZvcGVuKCIubWVtb3J5bGlzdCIsICJ3Iik7CisJaWYgKGZwID09IE5VTEwpCisJICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBNRU1fTElTVAorICAgIGZwcmludGYoZnAsIiAgIExhc3QgJWxpIE1FTU9SWSBBTExPQ0FURUQgOiAlbHUsIE1BWCB3YXMgJWx1XG4iLAorICAgICAgICAgICAgbmJCeXRlcywgZGVidWdNZW1TaXplLCBkZWJ1Z01heE1lbVNpemUpOworICAgIGZwcmludGYoZnAsIkJMT0NLICBOVU1CRVIgICBTSVpFICBUWVBFXG4iKTsKKyAgICBpZHggPSAwOworICAgIHhtbE11dGV4TG9jayh4bWxNZW1NdXRleCk7CisgICAgcCA9IG1lbWxpc3Q7CisgICAgd2hpbGUgKChwKSAmJiAobmJCeXRlcyA+IDApKSB7CisJICBmcHJpbnRmKGZwLCIlLTV1ICAlNmx1ICU2bHUgIixpZHgrKyxwLT5taF9udW1iZXIsCisJCSAgKHVuc2lnbmVkIGxvbmcpcC0+bWhfc2l6ZSk7CisgICAgICAgIHN3aXRjaCAocC0+bWhfdHlwZSkgeworICAgICAgICAgICBjYXNlIFNUUkRVUF9UWVBFOmZwcmludGYoZnAsInN0cmR1cCgpICBpbiAiKTticmVhazsKKyAgICAgICAgICAgY2FzZSBNQUxMT0NfVFlQRTpmcHJpbnRmKGZwLCJtYWxsb2MoKSAgaW4gIik7YnJlYWs7CisgICAgICAgICAgIGNhc2UgUkVBTExPQ19UWVBFOmZwcmludGYoZnAsInJlYWxsb2MoKSBpbiAiKTticmVhazsKKyAgICAgICAgICAgY2FzZSBNQUxMT0NfQVRPTUlDX1RZUEU6ZnByaW50ZihmcCwiYXRvbWljbWFsbG9jKCkgIGluICIpO2JyZWFrOworICAgICAgICAgICBjYXNlIFJFQUxMT0NfQVRPTUlDX1RZUEU6ZnByaW50ZihmcCwiYXRvbWljcmVhbGxvYygpIGluICIpO2JyZWFrOworICAgICAgICAgICBkZWZhdWx0OgorCSAgICAgICAgZnByaW50ZihmcCwiVW5rbm93biBtZW1vcnkgYmxvY2ssIG1heSBiZSBjb3JydXB0ZWQiKTsKKwkJeG1sTXV0ZXhVbmxvY2soeG1sTWVtTXV0ZXgpOworCQlpZiAob2xkX2ZwID09IE5VTEwpCisJCSAgICBmY2xvc2UoZnApOworCQlyZXR1cm47CisgICAgICAgIH0KKwlpZiAocC0+bWhfZmlsZSAhPSBOVUxMKSBmcHJpbnRmKGZwLCIlcygldSkiLCBwLT5taF9maWxlLCBwLT5taF9saW5lKTsKKyAgICAgICAgaWYgKHAtPm1oX3RhZyAhPSBNRU1UQUcpCisJICAgICAgZnByaW50ZihmcCwiICBJTlZBTElEIik7CisgICAgICAgIG5iKys7CisJaWYgKG5iIDwgMTAwKQorCSAgICB4bWxNZW1Db250ZW50U2hvdyhmcCwgcCk7CisJZWxzZQorCSAgICBmcHJpbnRmKGZwLCIgc2tpcCIpOworCisgICAgICAgIGZwcmludGYoZnAsIlxuIik7CisJbmJCeXRlcyAtPSAodW5zaWduZWQgbG9uZylwLT5taF9zaXplOworICAgICAgICBwID0gcC0+bWhfbmV4dDsKKyAgICB9CisgICAgeG1sTXV0ZXhVbmxvY2soeG1sTWVtTXV0ZXgpOworI2Vsc2UKKyAgICBmcHJpbnRmKGZwLCJNZW1vcnkgbGlzdCBub3QgY29tcGlsZWQgKE1FTV9MSVNUIG5vdCBkZWZpbmVkICEpXG4iKTsKKyNlbmRpZgorICAgIGlmIChvbGRfZnAgPT0gTlVMTCkKKwlmY2xvc2UoZnApOworfQorCisvKioKICAqIHhtbE1lbURpc3BsYXk6CiAgKiBAZnA6ICBhIEZJTEUgZGVzY3JpcHRvciB1c2VkIGFzIHRoZSBvdXRwdXQgZmlsZSwgaWYgTlVMTCwgdGhlIHJlc3VsdCBpcwogICogICAgICAgd3JpdHRlbiB0byB0aGUgZmlsZSAubWVtb3J5bGlzdApAQCAtNjY1LDcgKzczOCw3IEBACiAgICAgZnByaW50ZihmcCwiICAgICAgJXNcblxuIiwgYnVmKTsKICNlbmRpZgogCi0gICAgCisKICAgICBmcHJpbnRmKGZwLCIgICAgICBNRU1PUlkgQUxMT0NBVEVEIDogJWx1LCBNQVggd2FzICVsdVxuIiwKICAgICAgICAgICAgIGRlYnVnTWVtU2l6ZSwgZGVidWdNYXhNZW1TaXplKTsKICAgICBmcHJpbnRmKGZwLCJCTE9DSyAgTlVNQkVSICAgU0laRSAgVFlQRVxuIik7CkBAIC03NDIsNyArODE1LDcgQEAKICAqCiAgKiBpbnRlcm5hbCBlcnJvciBmdW5jdGlvbi4KICAqLwotIAorCiBzdGF0aWMgdm9pZCBkZWJ1Z21lbV90YWdfZXJyb3Iodm9pZCAqcCkKIHsKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC04MDIsNyArODc1LDcgQEAKIAl9CiAgICAgfQogICAgIHhtbE11dGV4VW5sb2NrKHhtbE1lbU11dGV4KTsKLSNlbmRpZiAvKiBNRU1fTElTVCAqLyAgICAKKyNlbmRpZiAvKiBNRU1fTElTVCAqLwogfQogCiAvKioKQEAgLTg0OSwxMSArOTIyLDExIEBACiB7CiAjaWZkZWYgSEFWRV9TVERMSUJfSAogICAgICBjaGFyICpicmVha3BvaW50OwotI2VuZGlmICAgICAKKyNlbmRpZgogI2lmZGVmIERFQlVHX01FTU9SWQogICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkgICAgICJ4bWxJbml0TWVtb3J5KClcbiIpOwotI2VuZGlmICAgICAKKyNlbmRpZgogICAgIC8qCiAgICAgIFRoaXMgaXMgcmVhbGx5IG5vdCBnb29kIGNvZGUgKHNlZSBCdWcgMTMwNDE5KS4gIFN1Z2dlc3Rpb25zIGZvcgogICAgICBpbXByb3ZlbWVudCB3aWxsIGJlIHdlbGNvbWUhCkBAIC04NjcsMTggKzk0MCwxOCBAQAogICAgICBpZiAoYnJlYWtwb2ludCAhPSBOVUxMKSB7CiAgICAgICAgICBzc2NhbmYoYnJlYWtwb2ludCwgIiV1ZCIsICZ4bWxNZW1TdG9wQXRCbG9jayk7CiAgICAgIH0KLSNlbmRpZiAgICAgCisjZW5kaWYKICNpZmRlZiBIQVZFX1NURExJQl9ICiAgICAgIGJyZWFrcG9pbnQgPSBnZXRlbnYoIlhNTF9NRU1fVFJBQ0UiKTsKICAgICAgaWYgKGJyZWFrcG9pbnQgIT0gTlVMTCkgewogICAgICAgICAgc3NjYW5mKGJyZWFrcG9pbnQsICIlcCIsICZ4bWxNZW1UcmFjZUJsb2NrQXQpOwogICAgICB9Ci0jZW5kaWYgICAgIAotICAgIAorI2VuZGlmCisKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICAieG1sSW5pdE1lbW9yeSgpIE9rXG4iKTsKLSNlbmRpZiAgICAgCisjZW5kaWYKICAgICAgcmV0dXJuKDApOwogfQogCkBAIC04OTMsNyArOTY2LDcgQEAKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICAieG1sQ2xlYW51cE1lbW9yeSgpXG4iKTsKLSNlbmRpZiAgICAgCisjZW5kaWYKICAgICBpZiAoeG1sTWVtSW5pdGlhbGl6ZWQgPT0gMCkKICAgICAgICAgcmV0dXJuOwogCkBAIC05MDMsNyArOTc2LDcgQEAKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICAieG1sQ2xlYW51cE1lbW9yeSgpIE9rXG4iKTsKLSNlbmRpZiAgICAgCisjZW5kaWYKIH0KIAogLyoqCkBAIC05MjcsNyArMTAwMCw3IEBACiAjaWZkZWYgREVCVUdfTUVNT1JZCiAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCSAgICAgInhtbE1lbVNldHVwKClcbiIpOwotI2VuZGlmICAgICAKKyNlbmRpZgogICAgIGlmIChmcmVlRnVuYyA9PSBOVUxMKQogCXJldHVybigtMSk7CiAgICAgaWYgKG1hbGxvY0Z1bmMgPT0gTlVMTCkKQEAgLTk0NCw3ICsxMDE3LDcgQEAKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICAieG1sTWVtU2V0dXAoKSBPa1xuIik7Ci0jZW5kaWYgICAgIAorI2VuZGlmCiAgICAgcmV0dXJuKDApOwogfQogCkBAIC05OTQsNyArMTA2Nyw3IEBACiAjaWZkZWYgREVCVUdfTUVNT1JZCiAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCSAgICAgInhtbEdjTWVtU2V0dXAoKVxuIik7Ci0jZW5kaWYgICAgIAorI2VuZGlmCiAgICAgaWYgKGZyZWVGdW5jID09IE5VTEwpCiAJcmV0dXJuKC0xKTsKICAgICBpZiAobWFsbG9jRnVuYyA9PSBOVUxMKQpAQCAtMTAxMyw3ICsxMDg2LDcgQEAKICNpZmRlZiBERUJVR19NRU1PUlkKICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICAieG1sR2NNZW1TZXR1cCgpIE9rXG4iKTsKLSNlbmRpZiAgICAgCisjZW5kaWYKICAgICByZXR1cm4oMCk7CiB9CiAKZGlmZiAtLWdpdCBhL3htbG1vZHVsZS5jIGIveG1sbW9kdWxlLmMKaW5kZXggMTViY2YwNy4uOWZmZDYxMCAxMDA2NDQKLS0tIGEveG1sbW9kdWxlLmMKKysrIGIveG1sbW9kdWxlLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgIHJldHVybiAoMCk7CiB9CiAKLSNpZmRlZiBIQVZFX0RMT1BFTgorI2lmIGRlZmluZWQoSEFWRV9ETE9QRU4pICYmICFkZWZpbmVkKF9XSU4zMikKICNpZmRlZiBIQVZFX0RMRkNOX0gKICNpbmNsdWRlIDxkbGZjbi5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS94bWxyZWFkZXIuYyBiL3htbHJlYWRlci5jCmluZGV4IGQ3YmRkZWMuLmQ0MmIxYTAgMTAwNjQ0Ci0tLSBhL3htbHJlYWRlci5jCisrKyBiL3htbHJlYWRlci5jCkBAIC00NCw2ICs0NCwyNyBAQAogI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiAjZW5kaWYKIAorI2RlZmluZSBNQVhfRVJSX01TR19TSVpFIDY0MDAwCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIFZBX0NPUFkgd2FzIGNvZGVkIGZvbGxvd2luZyBhbiBleGFtcGxlIGluCisgKiB0aGUgU2FtYmEgcHJvamVjdC4gIEl0IG1heSBub3QgYmUgc3VmZmljaWVudCBmb3Igc29tZQorICogZXNvdGVyaWMgaW1wbGVtZW50YXRpb25zIG9mIHZhX2xpc3QgKGkuZS4gaXQgbWF5IG5lZWQKKyAqIHNvbWV0aGluZyBpbnZvbHZpbmcgYSBtZW1jcHkpIGJ1dCAoaG9wZWZ1bGx5KSB3aWxsIGJlCisgKiBzdWZmaWNpZW50IGZvciBsaWJ4bWwyLgorICovCisjaWZuZGVmIFZBX0NPUFkKKyAgI2lmZGVmIEhBVkVfVkFfQ09QWQorICAgICNkZWZpbmUgVkFfQ09QWShkZXN0LCBzcmMpIHZhX2NvcHkoZGVzdCwgc3JjKQorICAjZWxzZQorICAgICNpZmRlZiBIQVZFX19fVkFfQ09QWQorICAgICAgI2RlZmluZSBWQV9DT1BZKGRlc3Qsc3JjKSBfX3ZhX2NvcHkoZGVzdCwgc3JjKQorICAgICNlbHNlCisgICAgICAjZGVmaW5lIFZBX0NPUFkoZGVzdCxzcmMpIChkZXN0KSA9IChzcmMpCisgICAgI2VuZGlmCisgICNlbmRpZgorI2VuZGlmCisKIC8qICNkZWZpbmUgREVCVUdfQ0FMTEJBQ0tTICovCiAvKiAjZGVmaW5lIERFQlVHX1JFQURFUiAqLwogCkBAIC0yMzQsOCArMjU1LDYgQEAKICAgICBpZiAodGFibGUgPT0gTlVMTCkgCiAgICAgICAgIHJldHVybigtMSk7CiAKLSAgICBpZiAoYXR0ciA9PSBOVUxMKQotCXJldHVybigtMSk7CiAgICAgSUQgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGF0dHItPmNoaWxkcmVuLCAxKTsKICAgICBpZiAoSUQgPT0gTlVMTCkKIAlyZXR1cm4oLTEpOwpAQCAtMTg0OSwxNyArMTg2OCwyMiBAQAogICAgIH0KIAogICAgIGlmIChyZWFkZXItPnN0YXRlICE9IFhNTF9URVhUUkVBREVSX0JBQ0tUUkFDSykgewotICAgICAgICBpZiAocmVhZGVyLT5ub2RlLT5jaGlsZHJlbiAhPSAwKSB7Ci0gICAgICAgICAgICByZWFkZXItPm5vZGUgPSByZWFkZXItPm5vZGUtPmNoaWxkcmVuOwotICAgICAgICAgICAgcmVhZGVyLT5kZXB0aCsrOworCS8qIEhlcmUgcmVtb3ZlZCB0cmF2ZXJzYWwgdG8gY2hpbGQsIGJlY2F1c2Ugd2Ugd2FudCB0byBza2lwIHRoZSBzdWJ0cmVlLAorCXJlcGxhY2Ugd2l0aCB0cmF2ZXJzYWwgdG8gc2libGluZyB0byBza2lwIHN1YnRyZWUgKi8KKyAgICAgICAgaWYgKHJlYWRlci0+bm9kZS0+bmV4dCAhPSAwKSB7CisJICAgIC8qIE1vdmUgdG8gc2libGluZyBpZiBwcmVzZW50LHNraXBwaW5nIHN1Yi10cmVlICovCisgICAgICAgICAgICByZWFkZXItPm5vZGUgPSByZWFkZXItPm5vZGUtPm5leHQ7CiAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gWE1MX1RFWFRSRUFERVJfU1RBUlQ7CiAgICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgIH0KIAorCS8qIGlmIHJlYWRlci0+bm9kZS0+bmV4dCBpcyBOVUxMIG1lYW4gbm8gc3VidHJlZSBmb3IgY3VycmVudCBub2RlLAorCXNvIG5lZWQgdG8gbW92ZSB0byBzaWJsaW5nIG9mIHBhcmVudCBub2RlIGlmIHByZXNlbnQgKi8KICAgICAgICAgaWYgKChyZWFkZXItPm5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgfHwKICAgICAgICAgICAgIChyZWFkZXItPm5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSkgewogICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IFhNTF9URVhUUkVBREVSX0JBQ0tUUkFDSzsKLSAgICAgICAgICAgIHJldHVybigxKTsKKwkgICAgLyogVGhpcyB3aWxsIG1vdmUgdG8gcGFyZW50IGlmIHByZXNlbnQgKi8KKyAgICAgICAgICAgIHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4NzgsNyArMTkwMiw4IEBACiAgICAgICAgIHJlYWRlci0+bm9kZSA9IHJlYWRlci0+bm9kZS0+cGFyZW50OwogICAgICAgICByZWFkZXItPmRlcHRoLS07CiAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBYTUxfVEVYVFJFQURFUl9CQUNLVFJBQ0s7Ci0gICAgICAgIHJldHVybigxKTsKKwkvKiBSZXBlYXQgcHJvY2VzcyB0byBtb3ZlIHRvIHNpYmxpbmcgb2YgcGFyZW50IG5vZGUgaWYgcHJlc2VudCAqLworICAgICAgICB4bWxUZXh0UmVhZGVyTmV4dFRyZWUocmVhZGVyKTsKICAgICB9CiAKICAgICByZWFkZXItPnN0YXRlID0gWE1MX1RFWFRSRUFERVJfRU5EOwpAQCAtMjkzNiw3ICsyOTYxLDcgQEAKICAqCiAgKiBHZXQgdGhlIG5vZGUgdHlwZSBvZiB0aGUgY3VycmVudCBub2RlCiAgKiBSZWZlcmVuY2U6Ci0gKiBodHRwOi8vZG90Z251Lm9yZy9wbmV0bGliLWRvYy9TeXN0ZW0vWG1sL1htbE5vZGVUeXBlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9kb3RnbnUvcG5ldGxpYi1kb2MvU3lzdGVtL1htbC9YbWxOb2RlVHlwZS5odG1sCiAgKgogICogUmV0dXJucyB0aGUgeG1sTm9kZVR5cGUgb2YgdGhlIGN1cnJlbnQgbm9kZSBvciAtMSBpbiBjYXNlIG9mIGVycm9yCiAgKi8KQEAgLTM5NjAsOCArMzk4NSw3IEBACiAJcmV0dXJuKE5VTEwpOwogICAgIGlmIChyZWFkZXItPmRvYyAhPSBOVUxMKQogICAgICAgICByZXR1cm4ocmVhZGVyLT5kb2MpOwotICAgIGlmICgocmVhZGVyID09IE5VTEwpIHx8IChyZWFkZXItPmN0eHQgPT0gTlVMTCkgfHwKLSAgICAgICAgKHJlYWRlci0+Y3R4dC0+bXlEb2MgPT0gTlVMTCkpCisgICAgaWYgKChyZWFkZXItPmN0eHQgPT0gTlVMTCkgfHwgKHJlYWRlci0+Y3R4dC0+bXlEb2MgPT0gTlVMTCkpCiAJcmV0dXJuKE5VTEwpOwogICAgIAogICAgIHJlYWRlci0+cHJlc2VydmUgPSAxOwpAQCAtNDQ5NywzMCArNDUyMSwzMiBAQAogLyogaGVscGVyIHRvIGJ1aWxkIGEgeG1sTWFsbG9jJ2VkIHN0cmluZyBmcm9tIGEgZm9ybWF0IGFuZCB2YV9saXN0ICovCiBzdGF0aWMgY2hhciAqCiB4bWxUZXh0UmVhZGVyQnVpbGRNZXNzYWdlKGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcCkgewotICAgIGludCBzaXplOworICAgIGludCBzaXplID0gMDsKICAgICBpbnQgY2hhcnM7CiAgICAgY2hhciAqbGFyZ2VyOwotICAgIGNoYXIgKnN0cjsKLQotICAgIHN0ciA9IChjaGFyICopIHhtbE1hbGxvY0F0b21pYygxNTApOwotICAgIGlmIChzdHIgPT0gTlVMTCkgewotCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAieG1sTWFsbG9jIGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc2l6ZSA9IDE1MDsKKyAgICBjaGFyICpzdHIgPSBOVUxMOworICAgIHZhX2xpc3QgYXE7CiAKICAgICB3aGlsZSAoMSkgewotICAgICAgICBjaGFycyA9IHZzbnByaW50ZihzdHIsIHNpemUsIG1zZywgYXApOwotICAgICAgICBpZiAoKGNoYXJzID4gLTEpICYmIChjaGFycyA8IHNpemUpKQorICAgICAgICBWQV9DT1BZKGFxLCBhcCk7CisgICAgICAgIGNoYXJzID0gdnNucHJpbnRmKHN0ciwgc2l6ZSwgbXNnLCBhcSk7CisgICAgICAgIHZhX2VuZChhcSk7CisgICAgICAgIGlmIChjaGFycyA8IDApIHsKKwkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJ2c25wcmludGYgZmFpbGVkICFcbiIpOworCSAgICBpZiAoc3RyKSAKKwkgICAgCXhtbEZyZWUoc3RyKTsKKwkgICAgcmV0dXJuIE5VTEw7ICAKKwl9CisJaWYgKChjaGFycyA8IHNpemUpIHx8IChzaXplID09IE1BWF9FUlJfTVNHX1NJWkUpKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChjaGFycyA+IC0xKQotICAgICAgICAgICAgc2l6ZSArPSBjaGFycyArIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNpemUgKz0gMTAwOworICAgICAgICBpZiAoY2hhcnMgPCBNQVhfRVJSX01TR19TSVpFKQorICAgICAgICAJc2l6ZSA9IGNoYXJzICsgMTsKKwllbHNlCisJCXNpemUgPSBNQVhfRVJSX01TR19TSVpFOwogICAgICAgICBpZiAoKGxhcmdlciA9IChjaGFyICopIHhtbFJlYWxsb2Moc3RyLCBzaXplKSkgPT0gTlVMTCkgewogCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgInhtbFJlYWxsb2MgZmFpbGVkICFcbiIpOwotICAgICAgICAgICAgeG1sRnJlZShzdHIpOworCSAgICBpZiAoc3RyKQorICAgICAgICAgICAgCXhtbEZyZWUoc3RyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIHN0ciA9IGxhcmdlcjsKZGlmZiAtLWdpdCBhL3htbHJlZ2V4cC5jIGIveG1scmVnZXhwLmMKaW5kZXggYTNlMTZjNS4uNzM1OThhNSAxMDA2NDQKLS0tIGEveG1scmVnZXhwLmMKKysrIGIveG1scmVnZXhwLmMKQEAgLTE1MzIsNiArMTUzMiw4IEBACiBzdGF0aWMgaW50CiB4bWxGQUdlbmVyYXRlVHJhbnNpdGlvbnMoeG1sUmVnUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxSZWdTdGF0ZVB0ciBmcm9tLAogCSAgICAgICAgICAgICAgICAgeG1sUmVnU3RhdGVQdHIgdG8sIHhtbFJlZ0F0b21QdHIgYXRvbSkgeworICAgIHhtbFJlZ1N0YXRlUHRyIGVuZDsKKwogICAgIGlmIChhdG9tID09IE5VTEwpIHsKIAlFUlJPUigiZ2VucmF0ZSB0cmFuc2l0aW9uOiBhdG9tID09IE5VTEwiKTsKIAlyZXR1cm4oLTEpOwpAQCAtMTY4OSwxMiArMTY5MSwzMSBAQAogCWVsc2UgewogCSAgICByZXR1cm4oLTEpOwogCX0KKyAgICB9IAorICAgIGVuZCA9IHRvOworICAgIGlmICgoYXRvbS0+cXVhbnQgPT0gWE1MX1JFR0VYUF9RVUFOVF9NVUxUKSB8fCAKKyAgICAgICAgKGF0b20tPnF1YW50ID09IFhNTF9SRUdFWFBfUVVBTlRfUExVUykpIHsKKwkvKgorCSAqIERvIG5vdCBwb2xsdXRlIHRoZSB0YXJnZXQgc3RhdGUgYnkgYWRkaW5nIHRyYW5zaXRpb25zIGZyb20KKwkgKiBpdCBhcyBpdCBpcyBsaWtlbHkgdG8gYmUgdGhlIHNoYXJlZCB0YXJnZXQgb2YgbXVsdGlwbGUgYnJhbmNoZXMuCisJICogU28gaXNvbGF0ZSB3aXRoIGFuIGVwc2lsb24gdHJhbnNpdGlvbi4KKwkgKi8KKyAgICAgICAgeG1sUmVnU3RhdGVQdHIgdG1wOworCQorCXRtcCA9IHhtbFJlZ05ld1N0YXRlKGN0eHQpOworCWlmICh0bXAgIT0gTlVMTCkKKwkgICAgeG1sUmVnU3RhdGVQdXNoKGN0eHQsIHRtcCk7CisJZWxzZSB7CisJICAgIHJldHVybigtMSk7CisJfQorCXhtbEZBR2VuZXJhdGVFcHNpbG9uVHJhbnNpdGlvbihjdHh0LCB0bXAsIHRvKTsKKwl0byA9IHRtcDsKICAgICB9CiAgICAgaWYgKHhtbFJlZ0F0b21QdXNoKGN0eHQsIGF0b20pIDwgMCkgewogCXJldHVybigtMSk7CiAgICAgfQogICAgIHhtbFJlZ1N0YXRlQWRkVHJhbnMoY3R4dCwgZnJvbSwgYXRvbSwgdG8sIC0xLCAtMSk7Ci0gICAgY3R4dC0+c3RhdGUgPSB0bzsKKyAgICBjdHh0LT5zdGF0ZSA9IGVuZDsKICAgICBzd2l0Y2ggKGF0b20tPnF1YW50KSB7CiAJY2FzZSBYTUxfUkVHRVhQX1FVQU5UX09QVDoKIAkgICAgYXRvbS0+cXVhbnQgPSBYTUxfUkVHRVhQX1FVQU5UX09OQ0U7CkBAIC0zMTQxLDcgKzMxNjIsOCBAQAogCWV4ZWMtPmNvdW50cyA9IE5VTEw7CiAgICAgd2hpbGUgKChleGVjLT5zdGF0dXMgPT0gMCkgJiYKIAkgICAoKGV4ZWMtPmlucHV0U3RyaW5nW2V4ZWMtPmluZGV4XSAhPSAwKSB8fAotCSAgICAoZXhlYy0+c3RhdGUtPnR5cGUgIT0gWE1MX1JFR0VYUF9GSU5BTF9TVEFURSkpKSB7CisJICAgICgoZXhlYy0+c3RhdGUgIT0gTlVMTCkgJiYKKwkgICAgIChleGVjLT5zdGF0ZS0+dHlwZSAhPSBYTUxfUkVHRVhQX0ZJTkFMX1NUQVRFKSkpKSB7CiAJeG1sUmVnVHJhbnNQdHIgdHJhbnM7CiAJeG1sUmVnQXRvbVB0ciBhdG9tOwogCkBAIC00ODg1LDY0ICs0OTA3LDYgQEAKIH0KIAogLyoqCi0gKiB4bWxGQVBhcnNlQ2hhclJlZjoKLSAqIEBjdHh0OiAgYSByZWdleHAgcGFyc2VyIGNvbnRleHQKLSAqCi0gKiBbMTldICAgWG1sQ2hhclJlZiAgIDo6PSAgICggJyYjJyBbMC05XSsgJzsnICkgfCAoJyAmI3gnIFswLTlhLWZBLUZdKyAnOycgKQotICovCi1zdGF0aWMgaW50Ci14bWxGQVBhcnNlQ2hhclJlZih4bWxSZWdQYXJzZXJDdHh0UHRyIGN0eHQpIHsKLSAgICBpbnQgcmV0ID0gMCwgY3VyOwotCi0gICAgaWYgKChDVVIgIT0gJyYnKSB8fCAoTlhUKDEpICE9ICcjJykpCi0JcmV0dXJuKC0xKTsKLSAgICBORVhUOwotICAgIE5FWFQ7Ci0gICAgY3VyID0gQ1VSOwotICAgIGlmIChjdXIgPT0gJ3gnKSB7Ci0JTkVYVDsKLQljdXIgPSBDVVI7Ci0JaWYgKCgoY3VyID49ICcwJykgJiYgKGN1ciA8PSAnOScpKSB8fAotCSAgICAoKGN1ciA+PSAnYScpICYmIChjdXIgPD0gJ2YnKSkgfHwKLQkgICAgKChjdXIgPj0gJ0EnKSAmJiAoY3VyIDw9ICdGJykpKSB7Ci0JICAgIHdoaWxlICgoKGN1ciA+PSAnMCcpICYmIChjdXIgPD0gJzknKSkgfHwKLQkgICAgICAgICAgICgoY3VyID49ICdhJykgJiYgKGN1ciA8PSAnZicpKSB8fAotCQkgICAoKGN1ciA+PSAnQScpICYmIChjdXIgPD0gJ0YnKSkpIHsKLQkJaWYgKChjdXIgPj0gJzAnKSAmJiAoY3VyIDw9ICc5JykpCi0JCSAgICByZXQgPSByZXQgKiAxNiArIGN1ciAtICcwJzsKLQkJZWxzZSBpZiAoKGN1ciA+PSAnYScpICYmIChjdXIgPD0gJ2YnKSkKLQkJICAgIHJldCA9IHJldCAqIDE2ICsgMTAgKyAoY3VyIC0gJ2EnKTsKLQkJZWxzZQotCQkgICAgcmV0ID0gcmV0ICogMTYgKyAxMCArIChjdXIgLSAnQScpOwotCQlORVhUOwotCQljdXIgPSBDVVI7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBFUlJPUigiQ2hhciByZWY6IGV4cGVjdGluZyBbMC05QS1GXSIpOwotCSAgICByZXR1cm4oLTEpOwotCX0KLSAgICB9IGVsc2UgewotCWlmICgoY3VyID49ICcwJykgJiYgKGN1ciA8PSAnOScpKSB7Ci0JICAgIHdoaWxlICgoY3VyID49ICcwJykgJiYgKGN1ciA8PSAnOScpKSB7Ci0JCXJldCA9IHJldCAqIDEwICsgY3VyIC0gJzAnOwotCQlORVhUOwotCQljdXIgPSBDVVI7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBFUlJPUigiQ2hhciByZWY6IGV4cGVjdGluZyBbMC05XSIpOwotCSAgICByZXR1cm4oLTEpOwotCX0KLSAgICB9Ci0gICAgaWYgKGN1ciAhPSAnOycpIHsKLQlFUlJPUigiQ2hhciByZWY6IGV4cGVjdGluZyAnOyciKTsKLQlyZXR1cm4oLTEpOwotICAgIH0gZWxzZSB7Ci0JTkVYVDsKLSAgICB9Ci0gICAgcmV0dXJuKHJldCk7Ci19Ci0KLS8qKgogICogeG1sRkFQYXJzZUNoYXJSYW5nZToKICAqIEBjdHh0OiAgYSByZWdleHAgcGFyc2VyIGNvbnRleHQKICAqCkBAIC00OTYzLDEyICs0OTI3LDYgQEAKIAlyZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChDVVIgPT0gJyYnKSAmJiAoTlhUKDEpID09ICcjJykpIHsKLQllbmQgPSBzdGFydCA9IHhtbEZBUGFyc2VDaGFyUmVmKGN0eHQpOwotICAgICAgICB4bWxSZWdBdG9tQWRkUmFuZ2UoY3R4dCwgY3R4dC0+YXRvbSwgY3R4dC0+bmVnLAotCSAgICAgICAgICAgICAgICAgICBYTUxfUkVHRVhQX0NIQVJWQUwsIHN0YXJ0LCBlbmQsIE5VTEwpOwotCXJldHVybjsKLSAgICB9CiAgICAgY3VyID0gQ1VSOwogICAgIGlmIChjdXIgPT0gJ1xcJykgewogCU5FWFQ7CkBAIC01MDUyLDcgKzUwMTAsNyBAQAogc3RhdGljIHZvaWQKIHhtbEZBUGFyc2VQb3NDaGFyR3JvdXAoeG1sUmVnUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CiAgICAgZG8gewotCWlmICgoQ1VSID09ICdcXCcpIHx8IChDVVIgPT0gJy4nKSkgeworCWlmIChDVVIgPT0gJ1xcJykgewogCSAgICB4bWxGQVBhcnNlQ2hhckNsYXNzRXNjKGN0eHQpOwogCX0gZWxzZSB7CiAJICAgIHhtbEZBUGFyc2VDaGFyUmFuZ2UoY3R4dCk7CmRpZmYgLS1naXQgYS94bWxzYXZlLmMgYi94bWxzYXZlLmMKaW5kZXggY2JhYmQ3OC4uNTNiMjNlNiAxMDA2NDQKLS0tIGEveG1sc2F2ZS5jCisrKyBiL3htbHNhdmUuYwpAQCAtNDU3LDYgKzQ1Nyw0MCBAQAogICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgaW50IHhtbFNhdmVTd2l0Y2hFbmNvZGluZyh4bWxTYXZlQ3R4dFB0ciBjdHh0LCBjb25zdCBjaGFyICplbmNvZGluZykgeworICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYgPSBjdHh0LT5idWY7CisKKyAgICBpZiAoKGVuY29kaW5nICE9IE5VTEwpICYmIChidWYtPmVuY29kZXIgPT0gTlVMTCkgJiYgKGJ1Zi0+Y29udiA9PSBOVUxMKSkgeworCWJ1Zi0+ZW5jb2RlciA9IHhtbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKChjb25zdCBjaGFyICopZW5jb2RpbmcpOworCWlmIChidWYtPmVuY29kZXIgPT0gTlVMTCkgeworCSAgICB4bWxTYXZlRXJyKFhNTF9TQVZFX1VOS05PV05fRU5DT0RJTkcsIE5VTEwsCisJCSAgICAgICAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKKwkgICAgcmV0dXJuKC0xKTsKKwl9CisJYnVmLT5jb252ID0geG1sQnVmZmVyQ3JlYXRlKCk7CisJaWYgKGJ1Zi0+Y29udiA9PSBOVUxMKSB7CisJICAgIHhtbENoYXJFbmNDbG9zZUZ1bmMoYnVmLT5lbmNvZGVyKTsKKwkgICAgeG1sU2F2ZUVyck1lbW9yeSgiY3JlYXRpbmcgZW5jb2RpbmcgYnVmZmVyIik7CisJICAgIHJldHVybigtMSk7CisJfQorCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgc3RhdGUsIGUuZy4gaWYgb3V0cHV0dGluZyBhIEJPTQorCSAqLworCXhtbENoYXJFbmNPdXRGdW5jKGJ1Zi0+ZW5jb2RlciwgYnVmLT5jb252LCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHhtbFNhdmVDbGVhckVuY29kaW5nKHhtbFNhdmVDdHh0UHRyIGN0eHQpIHsKKyAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmID0gY3R4dC0+YnVmOworICAgIHhtbE91dHB1dEJ1ZmZlckZsdXNoKGJ1Zik7CisgICAgeG1sQ2hhckVuY0Nsb3NlRnVuYyhidWYtPmVuY29kZXIpOworICAgIHhtbEJ1ZmZlckZyZWUoYnVmLT5jb252KTsKKyAgICBidWYtPmVuY29kZXIgPSBOVUxMOworICAgIGJ1Zi0+Y29udiA9IE5VTEw7CisgICAgcmV0dXJuKDApOworfQorCiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogc3RhdGljIHZvaWQKIHhodG1sTm9kZUR1bXBPdXRwdXQoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpOwpAQCAtNjM4LDYgKzY3Miw2NiBAQAogICAgIH0KIH0KIAorI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKKy8qKgorICogeG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbDoKKyAqIEBjdXI6ICB0aGUgY3VycmVudCBub2RlCisgKgorICogRHVtcCBhbiBIVE1MIG5vZGUsIHJlY3Vyc2l2ZSBiZWhhdmlvdXIsIGNoaWxkcmVuIGFyZSBwcmludGVkIHRvby4KKyAqLworc3RhdGljIGludAoraHRtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoeG1sU2F2ZUN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBjdXIpIHsKKyAgICBjb25zdCB4bWxDaGFyICpvbGRlbmMgPSBOVUxMOworICAgIGNvbnN0IHhtbENoYXIgKm9sZGN0eHRlbmMgPSBjdHh0LT5lbmNvZGluZzsKKyAgICBjb25zdCB4bWxDaGFyICplbmNvZGluZyA9IGN0eHQtPmVuY29kaW5nOworICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYgPSBjdHh0LT5idWY7CisgICAgaW50IHN3aXRjaGVkX2VuY29kaW5nID0gMDsKKyAgICB4bWxEb2NQdHIgZG9jOworCisgICAgeG1sSW5pdFBhcnNlcigpOworCisgICAgZG9jID0gY3VyLT5kb2M7IHsKKyAgICBpZiAoZG9jICE9IE5VTEwpCisgICAgICAgIG9sZGVuYyA9IGRvYy0+ZW5jb2Rpbmc7CisJaWYgKGN0eHQtPmVuY29kaW5nICE9IE5VTEwpIHsKKwkgICAgZG9jLT5lbmNvZGluZyA9IEJBRF9DQVNUIGN0eHQtPmVuY29kaW5nOworCX0gZWxzZSBpZiAoZG9jLT5lbmNvZGluZyAhPSBOVUxMKSB7CisJICAgIGVuY29kaW5nID0gZG9jLT5lbmNvZGluZzsKKwl9CisgICAgfQorCisgICAgaWYgKChlbmNvZGluZyAhPSBOVUxMKSAmJiAoZG9jICE9IE5VTEwpKQorCWh0bWxTZXRNZXRhRW5jb2RpbmcoZG9jLCAoY29uc3QgeG1sQ2hhciAqKSBlbmNvZGluZyk7CisgICAgaWYgKChlbmNvZGluZyA9PSBOVUxMKSAmJiAoZG9jICE9IE5VTEwpKQorCWVuY29kaW5nID0gaHRtbEdldE1ldGFFbmNvZGluZyhkb2MpOworICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQorCWVuY29kaW5nID0gQkFEX0NBU1QgIkhUTUwiOworICAgIGlmICgoZW5jb2RpbmcgIT0gTlVMTCkgJiYgKG9sZGN0eHRlbmMgPT0gTlVMTCkgJiYKKwkoYnVmLT5lbmNvZGVyID09IE5VTEwpICYmIChidWYtPmNvbnYgPT0gTlVMTCkpIHsKKwlpZiAoeG1sU2F2ZVN3aXRjaEVuY29kaW5nKGN0eHQsIChjb25zdCBjaGFyKikgZW5jb2RpbmcpIDwgMCkgeworCSAgICBkb2MtPmVuY29kaW5nID0gb2xkZW5jOworCSAgICByZXR1cm4oLTEpOworCX0KKwlzd2l0Y2hlZF9lbmNvZGluZyA9IDE7CisgICAgfQorICAgIGlmIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfRk9STUFUKQorCWh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dChidWYsIGRvYywgY3VyLAorCQkJCSAgICAgICAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKKyAgICBlbHNlCisJaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0KGJ1ZiwgZG9jLCBjdXIsCisJCQkJICAgICAgIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDApOworICAgIC8qCisgICAgICogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHNhdmluZyBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50CisgICAgICovCisgICAgaWYgKChzd2l0Y2hlZF9lbmNvZGluZykgJiYgKG9sZGN0eHRlbmMgPT0gTlVMTCkpIHsKKwl4bWxTYXZlQ2xlYXJFbmNvZGluZyhjdHh0KTsKKyAgICB9CisgICAgaWYgKGRvYyAhPSBOVUxMKQorCWRvYy0+ZW5jb2RpbmcgPSBvbGRlbmM7CisgICAgcmV0dXJuKDApOworfQorI2VuZGlmCisKIC8qKgogICogeG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbDoKICAqIEBjdXI6ICB0aGUgY3VycmVudCBub2RlCkBAIC02NjIsNiArNzU2LDE5IEBACiAJeG1sRG9jQ29udGVudER1bXBPdXRwdXQoY3R4dCwgKHhtbERvY1B0cikgY3VyKTsKIAlyZXR1cm47CiAgICAgfQorI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKKyAgICBpZiAoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX1hIVE1MKSB7CisgICAgICAgIHhodG1sTm9kZUR1bXBPdXRwdXQoY3R4dCwgY3VyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKChjdXItPnR5cGUgIT0gWE1MX05BTUVTUEFDRV9ERUNMKSAmJiAoY3VyLT5kb2MgIT0gTlVMTCkgJiYKKyAgICAgICAgIChjdXItPmRvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKSAmJgorICAgICAgICAgKChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfQVNfWE1MKSA9PSAwKSkgfHwKKyAgICAgICAgKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9BU19IVE1MKSkgeworCWh0bWxOb2RlRHVtcE91dHB1dEludGVybmFsKGN0eHQsIGN1cik7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgogICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0RURF9OT0RFKSB7CiAgICAgICAgIHhtbER0ZER1bXBPdXRwdXQoY3R4dCwgKHhtbER0ZFB0cikgY3VyKTsKIAlyZXR1cm47CkBAIC03MjcsOCArODM0LDggQEAKIAlyZXR1cm47CiAgICAgfQogICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSkgewotCWlmIChjdXItPmNvbnRlbnQgPT0gTlVMTCkgewotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEyLCAiPCFbQ0RBVEFbXV0+Iik7CisJaWYgKGN1ci0+Y29udGVudCA9PSBOVUxMIHx8ICpjdXItPmNvbnRlbnQgPT0gJ1wwJykgeworCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEyLCAiPCFbQ0RBVEFbXV0+Iik7CiAJfSBlbHNlIHsKIAkgICAgc3RhcnQgPSBlbmQgPSBjdXItPmNvbnRlbnQ7CiAJICAgIHdoaWxlICgqZW5kICE9ICdcMCcpIHsKQEAgLTgzNSw5ICs5NDIsMTQgQEAKICAgICB4bWxDaGFyRW5jb2RpbmdPdXRwdXRGdW5jIG9sZGVzY2FwZUF0dHIgPSBjdHh0LT5lc2NhcGVBdHRyOwogICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWYgPSBjdHh0LT5idWY7CiAgICAgeG1sQ2hhckVuY29kaW5nIGVuYzsKKyAgICBpbnQgc3dpdGNoZWRfZW5jb2RpbmcgPSAwOwogCiAgICAgeG1sSW5pdFBhcnNlcigpOwogCisgICAgaWYgKChjdXItPnR5cGUgIT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSkgJiYKKyAgICAgICAgKGN1ci0+dHlwZSAhPSBYTUxfRE9DVU1FTlRfTk9ERSkpCisJIHJldHVybigtMSk7CisKICAgICBpZiAoY3R4dC0+ZW5jb2RpbmcgIT0gTlVMTCkgewogICAgICAgICBjdXItPmVuY29kaW5nID0gQkFEX0NBU1QgY3R4dC0+ZW5jb2Rpbmc7CiAgICAgfSBlbHNlIGlmIChjdXItPmVuY29kaW5nICE9IE5VTEwpIHsKQEAgLTg0NywxMTAgKzk1OSwxMjYgQEAKIAkJICAgICB4bWxHZXRDaGFyRW5jb2RpbmdOYW1lKCh4bWxDaGFyRW5jb2RpbmcpIGN1ci0+Y2hhcnNldCk7CiAgICAgfQogCi0gICAgZW5jID0geG1sUGFyc2VDaGFyRW5jb2RpbmcoKGNvbnN0IGNoYXIqKSBlbmNvZGluZyk7Ci0gICAgaWYgKChlbmNvZGluZyAhPSBOVUxMKSAmJiAob2xkY3R4dGVuYyA9PSBOVUxMKSAmJgotICAgICAgICAoYnVmLT5lbmNvZGVyID09IE5VTEwpICYmIChidWYtPmNvbnYgPT0gTlVMTCkgJiYKLQkoKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9OT19ERUNMKSA9PSAwKSkgewotCWlmICgoZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX1VURjgpICYmCi0JICAgIChlbmMgIT0gWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSkgJiYKLQkgICAgKGVuYyAhPSBYTUxfQ0hBUl9FTkNPRElOR19BU0NJSSkpIHsKLQkgICAgLyoKLQkgICAgICogd2UgbmVlZCB0byBzd2l0Y2ggdG8gdGhpcyBlbmNvZGluZyBidXQganVzdCBmb3IgdGhpcyBkb2N1bWVudAotCSAgICAgKiBzaW5jZSB3ZSBvdXRwdXQgdGhlIFhNTERlY2wgdGhlIGNvbnZlcnNpb24gbXVzdCBiZSBkb25lIHRvIG5vdAotCSAgICAgKiBnZW5lcmF0ZSBub3Qgd2VsbCBmb3JtZWQgZG9jdW1lbnRzLgotCSAgICAgKi8KLQkgICAgYnVmLT5lbmNvZGVyID0geG1sRmluZENoYXJFbmNvZGluZ0hhbmRsZXIoKGNvbnN0IGNoYXIgKillbmNvZGluZyk7Ci0JICAgIGlmIChidWYtPmVuY29kZXIgPT0gTlVMTCkgewotCQl4bWxTYXZlRXJyKFhNTF9TQVZFX1VOS05PV05fRU5DT0RJTkcsIE5VTEwsCi0JCSAgICAgICAgICAgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CisgICAgaWYgKCgoY3VyLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpICYmCisgICAgICAgICAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9BU19YTUwpID09IDApICYmCisgICAgICAgICAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9YSFRNTCkgPT0gMCkpIHx8CisgICAgICAgIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfQVNfSFRNTCkpIHsKKyNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECisgICAgICAgIGlmIChlbmNvZGluZyAhPSBOVUxMKQorCSAgICBodG1sU2V0TWV0YUVuY29kaW5nKGN1ciwgKGNvbnN0IHhtbENoYXIgKikgZW5jb2RpbmcpOworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkKKwkgICAgZW5jb2RpbmcgPSBodG1sR2V0TWV0YUVuY29kaW5nKGN1cik7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQorCSAgICBlbmNvZGluZyA9IEJBRF9DQVNUICJIVE1MIjsKKwlpZiAoKGVuY29kaW5nICE9IE5VTEwpICYmIChvbGRjdHh0ZW5jID09IE5VTEwpICYmCisJICAgIChidWYtPmVuY29kZXIgPT0gTlVMTCkgJiYgKGJ1Zi0+Y29udiA9PSBOVUxMKSkgeworCSAgICBpZiAoeG1sU2F2ZVN3aXRjaEVuY29kaW5nKGN0eHQsIChjb25zdCBjaGFyKikgZW5jb2RpbmcpIDwgMCkgeworCQljdXItPmVuY29kaW5nID0gb2xkZW5jOwogCQlyZXR1cm4oLTEpOwogCSAgICB9Ci0JICAgIGJ1Zi0+Y29udiA9IHhtbEJ1ZmZlckNyZWF0ZSgpOwotCSAgICBpZiAoYnVmLT5jb252ID09IE5VTEwpIHsKLQkJeG1sQ2hhckVuY0Nsb3NlRnVuYyhidWYtPmVuY29kZXIpOwotCQl4bWxTYXZlRXJyTWVtb3J5KCJjcmVhdGluZyBlbmNvZGluZyBidWZmZXIiKTsKLQkJcmV0dXJuKC0xKTsKLQkgICAgfQotCSAgICAvKgotCSAgICAgKiBpbml0aWFsaXplIHRoZSBzdGF0ZSwgZS5nLiBpZiBvdXRwdXR0aW5nIGEgQk9NCi0JICAgICAqLwotCSAgICB4bWxDaGFyRW5jT3V0RnVuYyhidWYtPmVuY29kZXIsIGJ1Zi0+Y29udiwgTlVMTCk7CisJICAgIHN3aXRjaGVkX2VuY29kaW5nID0gMTsKIAl9Ci0JaWYgKGN0eHQtPmVzY2FwZSA9PSB4bWxFc2NhcGVFbnRpdGllcykKLQkgICAgY3R4dC0+ZXNjYXBlID0gTlVMTDsKLQlpZiAoY3R4dC0+ZXNjYXBlQXR0ciA9PSB4bWxFc2NhcGVFbnRpdGllcykKLQkgICAgY3R4dC0+ZXNjYXBlQXR0ciA9IE5VTEw7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIFhNTCBkZWNsYXJhdGlvbgotICAgICAqLwotICAgIGlmICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX05PX0RFQ0wpID09IDApIHsKLQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDE0LCAiPD94bWwgdmVyc2lvbj0iKTsKLQlpZiAoY3VyLT52ZXJzaW9uICE9IE5VTEwpIAotCSAgICB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYtPmJ1ZmZlciwgY3VyLT52ZXJzaW9uKTsKKyAgICAgICAgaWYgKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9GT1JNQVQpCisJICAgIGh0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogCWVsc2UKLQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCA1LCAiXCIxLjBcIiIpOwotCWlmIChlbmNvZGluZyAhPSBOVUxMKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMTAsICIgZW5jb2Rpbmc9Iik7Ci0JICAgIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1Zi0+YnVmZmVyLCAoeG1sQ2hhciAqKSBlbmNvZGluZyk7Ci0JfQotCXN3aXRjaCAoY3VyLT5zdGFuZGFsb25lKSB7Ci0JICAgIGNhc2UgMDoKLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxNiwgIiBzdGFuZGFsb25lPVwibm9cIiIpOwotCQlicmVhazsKLQkgICAgY2FzZSAxOgotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDE3LCAiIHN0YW5kYWxvbmU9XCJ5ZXNcIiIpOwotCQlicmVhazsKLQl9Ci0JeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiPz5cbiIpOwotICAgIH0KLQotI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKLSAgICBpZiAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9OT19YSFRNTCkgPT0gMCkgewotCWR0ZCA9IHhtbEdldEludFN1YnNldChjdXIpOwotCWlmIChkdGQgIT0gTlVMTCkgewotCSAgICBpc194aHRtbCA9IHhtbElzWEhUTUwoZHRkLT5TeXN0ZW1JRCwgZHRkLT5FeHRlcm5hbElEKTsKLQkgICAgaWYgKGlzX3hodG1sIDwgMCkgaXNfeGh0bWwgPSAwOwotCX0KLSAgICB9CisJICAgIGh0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDApOworCWlmIChjdHh0LT5lbmNvZGluZyAhPSBOVUxMKQorCSAgICBjdXItPmVuY29kaW5nID0gb2xkZW5jOworCXJldHVybigwKTsKKyNlbHNlCisgICAgICAgIHJldHVybigtMSk7CiAjZW5kaWYKLSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB7Ci0gICAgICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBjdXItPmNoaWxkcmVuOworICAgIH0gZWxzZSBpZiAoKGN1ci0+dHlwZSA9PSBYTUxfRE9DVU1FTlRfTk9ERSkgfHwKKyAgICAgICAgICAgICAgIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfQVNfWE1MKSB8fAorICAgICAgICAgICAgICAgKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9YSFRNTCkpIHsKKwllbmMgPSB4bWxQYXJzZUNoYXJFbmNvZGluZygoY29uc3QgY2hhciopIGVuY29kaW5nKTsKKwlpZiAoKGVuY29kaW5nICE9IE5VTEwpICYmIChvbGRjdHh0ZW5jID09IE5VTEwpICYmCisJICAgIChidWYtPmVuY29kZXIgPT0gTlVMTCkgJiYgKGJ1Zi0+Y29udiA9PSBOVUxMKSAmJgorCSAgICAoKGN0eHQtPm9wdGlvbnMgJiBYTUxfU0FWRV9OT19ERUNMKSA9PSAwKSkgeworCSAgICBpZiAoKGVuYyAhPSBYTUxfQ0hBUl9FTkNPRElOR19VVEY4KSAmJgorCQkoZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpICYmCisJCShlbmMgIT0gWE1MX0NIQVJfRU5DT0RJTkdfQVNDSUkpKSB7CisJCS8qCisJCSAqIHdlIG5lZWQgdG8gc3dpdGNoIHRvIHRoaXMgZW5jb2RpbmcgYnV0IGp1c3QgZm9yIHRoaXMKKwkJICogZG9jdW1lbnQgc2luY2Ugd2Ugb3V0cHV0IHRoZSBYTUxEZWNsIHRoZSBjb252ZXJzaW9uCisJCSAqIG11c3QgYmUgZG9uZSB0byBub3QgZ2VuZXJhdGUgbm90IHdlbGwgZm9ybWVkIGRvY3VtZW50cy4KKwkJICovCisJCWlmICh4bWxTYXZlU3dpdGNoRW5jb2RpbmcoY3R4dCwgKGNvbnN0IGNoYXIqKSBlbmNvZGluZykgPCAwKSB7CisJCSAgICBjdXItPmVuY29kaW5nID0gb2xkZW5jOworCQkgICAgcmV0dXJuKC0xKTsKKwkJfQorCQlzd2l0Y2hlZF9lbmNvZGluZyA9IDE7CisJICAgIH0KKwkgICAgaWYgKGN0eHQtPmVzY2FwZSA9PSB4bWxFc2NhcGVFbnRpdGllcykKKwkJY3R4dC0+ZXNjYXBlID0gTlVMTDsKKwkgICAgaWYgKGN0eHQtPmVzY2FwZUF0dHIgPT0geG1sRXNjYXBlRW50aXRpZXMpCisJCWN0eHQtPmVzY2FwZUF0dHIgPSBOVUxMOworCX0KIAotCXdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0JICAgIGN0eHQtPmxldmVsID0gMDsKLSNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECi0JICAgIGlmIChpc194aHRtbCkKLQkJeGh0bWxOb2RlRHVtcE91dHB1dChjdHh0LCBjaGlsZCk7CisKKwkvKgorCSAqIFNhdmUgdGhlIFhNTCBkZWNsYXJhdGlvbgorCSAqLworCWlmICgoY3R4dC0+b3B0aW9ucyAmIFhNTF9TQVZFX05PX0RFQ0wpID09IDApIHsKKwkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxNCwgIjw/eG1sIHZlcnNpb249Iik7CisJICAgIGlmIChjdXItPnZlcnNpb24gIT0gTlVMTCkgCisJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1Zi0+YnVmZmVyLCBjdXItPnZlcnNpb24pOwogCSAgICBlbHNlCisJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgNSwgIlwiMS4wXCIiKTsKKwkgICAgaWYgKGVuY29kaW5nICE9IE5VTEwpIHsKKwkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxMCwgIiBlbmNvZGluZz0iKTsKKwkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLT5idWZmZXIsICh4bWxDaGFyICopIGVuY29kaW5nKTsKKwkgICAgfQorCSAgICBzd2l0Y2ggKGN1ci0+c3RhbmRhbG9uZSkgeworCQljYXNlIDA6CisJCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDE2LCAiIHN0YW5kYWxvbmU9XCJub1wiIik7CisJCSAgICBicmVhazsKKwkJY2FzZSAxOgorCQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxNywgIiBzdGFuZGFsb25lPVwieWVzXCIiKTsKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMywgIj8+XG4iKTsKKwl9CisKKyNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECisgICAgICAgIGlmIChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfWEhUTUwpCisgICAgICAgICAgICBpc194aHRtbCA9IDE7CisJaWYgKChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfTk9fWEhUTUwpID09IDApIHsKKwkgICAgZHRkID0geG1sR2V0SW50U3Vic2V0KGN1cik7CisJICAgIGlmIChkdGQgIT0gTlVMTCkgeworCQlpc194aHRtbCA9IHhtbElzWEhUTUwoZHRkLT5TeXN0ZW1JRCwgZHRkLT5FeHRlcm5hbElEKTsKKwkJaWYgKGlzX3hodG1sIDwgMCkgaXNfeGh0bWwgPSAwOworCSAgICB9CisJfQogI2VuZGlmCi0JCXhtbE5vZGVEdW1wT3V0cHV0SW50ZXJuYWwoY3R4dCwgY2hpbGQpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDEsICJcbiIpOwotCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OworCWlmIChjdXItPmNoaWxkcmVuICE9IE5VTEwpIHsKKwkgICAgeG1sTm9kZVB0ciBjaGlsZCA9IGN1ci0+Y2hpbGRyZW47CisKKwkgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKKwkJY3R4dC0+bGV2ZWwgPSAwOworI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKKwkJaWYgKGlzX3hodG1sKQorCQkgICAgeGh0bWxOb2RlRHVtcE91dHB1dChjdHh0LCBjaGlsZCk7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgeG1sTm9kZUR1bXBPdXRwdXRJbnRlcm5hbChjdHh0LCBjaGlsZCk7CisJCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgMSwgIlxuIik7CisJCWNoaWxkID0gY2hpbGQtPm5leHQ7CisJICAgIH0KIAl9CiAgICAgfQotICAgIGlmIChjdHh0LT5lbmNvZGluZyAhPSBOVUxMKQotICAgICAgICBjdXItPmVuY29kaW5nID0gb2xkZW5jOwotICAgIAorCiAgICAgLyoKICAgICAgKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgc2F2aW5nIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKICAgICAgKi8KLSAgICBpZiAoKGVuY29kaW5nICE9IE5VTEwpICYmIChvbGRjdHh0ZW5jID09IE5VTEwpICYmCi0JKChjdHh0LT5vcHRpb25zICYgWE1MX1NBVkVfTk9fREVDTCkgPT0gMCkpIHsKLQlpZiAoKGVuYyAhPSBYTUxfQ0hBUl9FTkNPRElOR19VVEY4KSAmJgotCSAgICAoZW5jICE9IFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpICYmCi0JICAgIChlbmMgIT0gWE1MX0NIQVJfRU5DT0RJTkdfQVNDSUkpKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlckZsdXNoKGJ1Zik7Ci0JICAgIHhtbENoYXJFbmNDbG9zZUZ1bmMoYnVmLT5lbmNvZGVyKTsKLQkgICAgeG1sQnVmZmVyRnJlZShidWYtPmNvbnYpOwotCSAgICBidWYtPmVuY29kZXIgPSBOVUxMOwotCSAgICBidWYtPmNvbnYgPSBOVUxMOwotCX0KKyAgICBpZiAoKHN3aXRjaGVkX2VuY29kaW5nKSAmJiAob2xkY3R4dGVuYyA9PSBOVUxMKSkgeworCXhtbFNhdmVDbGVhckVuY29kaW5nKGN0eHQpOwogCWN0eHQtPmVzY2FwZSA9IG9sZGVzY2FwZTsKIAljdHh0LT5lc2NhcGVBdHRyID0gb2xkZXNjYXBlQXR0cjsKICAgICB9CisgICAgY3VyLT5lbmNvZGluZyA9IG9sZGVuYzsKICAgICByZXR1cm4oMCk7CiB9CiAKQEAgLTEyMzYsMjEgKzEzNjQsMjUgQEAKIAlyZXR1cm47CiAgICAgfQogICAgIGlmIChjdXItPnR5cGUgPT0gWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSkgewotCXN0YXJ0ID0gZW5kID0gY3VyLT5jb250ZW50OwotCXdoaWxlICgqZW5kICE9ICdcMCcpIHsKLQkgICAgaWYgKCplbmQgPT0gJ10nICYmICooZW5kICsgMSkgPT0gJ10nICYmICooZW5kICsgMikgPT0gJz4nKSB7Ci0JCWVuZCA9IGVuZCArIDI7Ci0JCXhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIGVuZCAtIHN0YXJ0LCAoY29uc3QgY2hhciAqKXN0YXJ0KTsKLQkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7Ci0JCXN0YXJ0ID0gZW5kOworCWlmIChjdXItPmNvbnRlbnQgPT0gTlVMTCB8fCAqY3VyLT5jb250ZW50ID09ICdcMCcpIHsKKwkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAxMiwgIjwhW0NEQVRBW11dPiIpOworCX0gZWxzZSB7CisJICAgIHN0YXJ0ID0gZW5kID0gY3VyLT5jb250ZW50OworCSAgICB3aGlsZSAoKmVuZCAhPSAnXDAnKSB7CisJCWlmICgqZW5kID09ICddJyAmJiAqKGVuZCArIDEpID09ICddJyAmJiAqKGVuZCArIDIpID09ICc+JykgeworCQkgICAgZW5kID0gZW5kICsgMjsKKwkJICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOworCQkgICAgeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCBlbmQgLSBzdGFydCwgKGNvbnN0IGNoYXIgKilzdGFydCk7CisJCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICJdXT4iKTsKKwkJICAgIHN0YXJ0ID0gZW5kOworCQl9CisJCWVuZCsrOwogCSAgICB9Ci0JICAgIGVuZCsrOwotCX0KLQlpZiAoc3RhcnQgIT0gZW5kKSB7Ci0JICAgIHhtbE91dHB1dEJ1ZmZlcldyaXRlKGJ1ZiwgOSwgIjwhW0NEQVRBWyIpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyhidWYsIChjb25zdCBjaGFyICopc3RhcnQpOwotCSAgICB4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDMsICJdXT4iKTsKKwkgICAgaWYgKHN0YXJ0ICE9IGVuZCkgeworCQl4bWxPdXRwdXRCdWZmZXJXcml0ZShidWYsIDksICI8IVtDREFUQVsiKTsKKwkJeG1sT3V0cHV0QnVmZmVyV3JpdGVTdHJpbmcoYnVmLCAoY29uc3QgY2hhciAqKXN0YXJ0KTsKKwkJeG1sT3V0cHV0QnVmZmVyV3JpdGUoYnVmLCAzLCAiXV0+Iik7CisJICAgIH0KIAl9CiAJcmV0dXJuOwogICAgIH0KQEAgLTIwMDQsNiArMjEzNiw3IEBACiAgICAgY3R4dC5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgY3R4dC5lbmNvZGluZyA9IChjb25zdCB4bWxDaGFyICopIGVuY29kaW5nOwogICAgIHhtbFNhdmVDdHh0SW5pdCgmY3R4dCk7CisgICAgY3R4dC5vcHRpb25zIHw9IFhNTF9TQVZFX0FTX1hNTDsKIAogI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgICBkdGQgPSB4bWxHZXRJbnRTdWJzZXQoZG9jKTsKQEAgLTIwODksNiArMjIyMiw3IEBACiAgICAgY3R4dC5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgY3R4dC5lbmNvZGluZyA9IChjb25zdCB4bWxDaGFyICopIHR4dF9lbmNvZGluZzsKICAgICB4bWxTYXZlQ3R4dEluaXQoJmN0eHQpOworICAgIGN0eHQub3B0aW9ucyB8PSBYTUxfU0FWRV9BU19YTUw7CiAgICAgeG1sRG9jQ29udGVudER1bXBPdXRwdXQoJmN0eHQsIG91dF9kb2MpOwogICAgIHhtbE91dHB1dEJ1ZmZlckZsdXNoKG91dF9idWZmKTsKICAgICBpZiAob3V0X2J1ZmYtPmNvbnYgIT0gTlVMTCkgewpAQCAtMjIwNyw2ICsyMzQxLDcgQEAKICAgICBjdHh0LmZvcm1hdCA9IGZvcm1hdDsKICAgICBjdHh0LmVuY29kaW5nID0gKGNvbnN0IHhtbENoYXIgKikgZW5jb2Rpbmc7CiAgICAgeG1sU2F2ZUN0eHRJbml0KCZjdHh0KTsKKyAgICBjdHh0Lm9wdGlvbnMgfD0gWE1MX1NBVkVfQVNfWE1MOwogICAgIHhtbERvY0NvbnRlbnREdW1wT3V0cHV0KCZjdHh0LCBjdXIpOwogCiAgICAgcmV0ID0geG1sT3V0cHV0QnVmZmVyQ2xvc2UoYnVmKTsKQEAgLTIyNTYsNiArMjM5MSw3IEBACiAgICAgY3R4dC5mb3JtYXQgPSAwOwogICAgIGN0eHQuZW5jb2RpbmcgPSAoY29uc3QgeG1sQ2hhciAqKSBlbmNvZGluZzsKICAgICB4bWxTYXZlQ3R4dEluaXQoJmN0eHQpOworICAgIGN0eHQub3B0aW9ucyB8PSBYTUxfU0FWRV9BU19YTUw7CiAgICAgeG1sRG9jQ29udGVudER1bXBPdXRwdXQoJmN0eHQsIGN1cik7CiAgICAgcmV0ID0geG1sT3V0cHV0QnVmZmVyQ2xvc2UoYnVmKTsKICAgICByZXR1cm4ocmV0KTsKQEAgLTIyOTUsNiArMjQzMSw3IEBACiAgICAgY3R4dC5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgY3R4dC5lbmNvZGluZyA9IChjb25zdCB4bWxDaGFyICopIGVuY29kaW5nOwogICAgIHhtbFNhdmVDdHh0SW5pdCgmY3R4dCk7CisgICAgY3R4dC5vcHRpb25zIHw9IFhNTF9TQVZFX0FTX1hNTDsKICAgICB4bWxEb2NDb250ZW50RHVtcE91dHB1dCgmY3R4dCwgY3VyKTsKICAgICByZXQgPSB4bWxPdXRwdXRCdWZmZXJDbG9zZShidWYpOwogICAgIHJldHVybiAocmV0KTsKQEAgLTIzNDksNiArMjQ4Niw3IEBACiAgICAgY3R4dC5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgY3R4dC5lbmNvZGluZyA9IChjb25zdCB4bWxDaGFyICopIGVuY29kaW5nOwogICAgIHhtbFNhdmVDdHh0SW5pdCgmY3R4dCk7CisgICAgY3R4dC5vcHRpb25zIHw9IFhNTF9TQVZFX0FTX1hNTDsKIAogICAgIHhtbERvY0NvbnRlbnREdW1wT3V0cHV0KCZjdHh0LCBjdXIpOwogCmRpZmYgLS1naXQgYS94bWxzY2hlbWFzLmMgYi94bWxzY2hlbWFzLmMKaW5kZXggZjZiODZkZC4uYzkwYjE3MSAxMDA2NDQKLS0tIGEveG1sc2NoZW1hcy5jCisrKyBiL3htbHNjaGVtYXMuYwpAQCAtOTAsNyArOTAsNyBAQAogICNpZm5kZWYgREVCVUdfSURDX05PREVfVEFCTEUKICAgI2RlZmluZSBERUJVR19JRENfTk9ERV9UQUJMRQogICNlbmRpZgotI2VuZGlmICAgCisjZW5kaWYKIAogLyogI2RlZmluZSBFTkFCTEVfUEFSVElDTEVfUkVTVFJJQ1RJT04gMSAqLwogCkBAIC0zNzQsNyArMzc0LDcgQEAKICNkZWZpbmUgWE1MX1NDSEVNQV9TQ0hFTUFfUkVERUZJTkUgMwogCiAvKioKLSAqIHhtbFNjaGVtYVNjaGVtYVJlbGF0aW9uOiAKKyAqIHhtbFNjaGVtYVNjaGVtYVJlbGF0aW9uOgogICoKICAqIFVzZWQgdG8gY3JlYXRlIGEgZ3JhcGggb2Ygc2NoZW1hIHJlbGF0aW9uc2hpcHMuCiAgKi8KQEAgLTQwMiwxMiArNDAyLDEyIEBACiAgICAgaW50IHBhcnNlZDsKICAgICBpbnQgaW1wb3J0ZWQ7CiAgICAgaW50IHByZXNlcnZlRG9jOwotICAgIHhtbFNjaGVtYUl0ZW1MaXN0UHRyIGdsb2JhbHM7IC8qIEdsb2JhbCBjb21wb25lbnRzLiAqLyAKKyAgICB4bWxTY2hlbWFJdGVtTGlzdFB0ciBnbG9iYWxzOyAvKiBHbG9iYWwgY29tcG9uZW50cy4gKi8KICAgICB4bWxTY2hlbWFJdGVtTGlzdFB0ciBsb2NhbHM7IC8qIExvY2FsIGNvbXBvbmVudHMuICovCiB9OwogCiAvKioKLSAqIHhtbFNjaGVtYUltcG9ydDogCisgKiB4bWxTY2hlbWFJbXBvcnQ6CiAgKiAoZXh0ZW5kcyB4bWxTY2hlbWFCdWNrZXQpCiAgKgogICogUmVmbGVjdHMgYSBzY2hlbWEuIEhvbGRzIHNvbWUgaW5mb3JtYXRpb24KQEAgLTQyMiw5ICs0MjIsOSBAQAogICAgIGNvbnN0IHhtbENoYXIgKnNjaGVtYUxvY2F0aW9uOyAvKiBUaGUgVVJJIG9mIHRoZSBzY2hlbWEgZG9jdW1lbnQuICovCiAgICAgLyogRm9yIGNoYW1lbGVvbiBpbmNsdWRlcywgQG9yaWdUYXJnZXROYW1lc3BhY2Ugd2lsbCBiZSBOVUxMICovCiAgICAgY29uc3QgeG1sQ2hhciAqb3JpZ1RhcmdldE5hbWVzcGFjZTsKLSAgICAvKiAKKyAgICAvKgogICAgICogRm9yIGNoYW1lbGVvbiBpbmNsdWRlcywgQHRhcmdldE5hbWVzcGFjZSB3aWxsIGJlIHRoZQotICAgICogdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiAKKyAgICAqIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgaW5jbHVkaW5nIHNjaGVtYS4KICAgICAqLwogICAgIGNvbnN0IHhtbENoYXIgKnRhcmdldE5hbWVzcGFjZTsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiBUaGUgc2NoZW1hIG5vZGUtdHJlZS4gKi8KQEAgLTQ1Nyw3ICs0NTcsNyBAQAogICAgIGludCBwYXJzZWQ7CiAgICAgaW50IGltcG9ydGVkOwogICAgIGludCBwcmVzZXJ2ZURvYzsKLSAgICB4bWxTY2hlbWFJdGVtTGlzdFB0ciBnbG9iYWxzOyAvKiBHbG9iYWwgY29tcG9uZW50cy4gKi8gCisgICAgeG1sU2NoZW1hSXRlbUxpc3RQdHIgZ2xvYmFsczsgLyogR2xvYmFsIGNvbXBvbmVudHMuICovCiAgICAgeG1sU2NoZW1hSXRlbUxpc3RQdHIgbG9jYWxzOyAvKiBMb2NhbCBjb21wb25lbnRzLiAqLwogCiAgICAgLyogVGhlIG93bmluZyBtYWluIG9yIGltcG9ydCBzY2hlbWEgYnVja2V0LiAqLwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgeG1sU2NoZW1hVHlwZVR5cGUgdHlwZTsKICAgICB4bWxTY2hlbWFBbm5vdFB0ciBhbm5vdDsKICAgICB4bWxTY2hlbWFBdHRyaWJ1dGVVc2VQdHIgbmV4dDsgLyogVGhlIG5leHQgYXR0ci4gdXNlLiAqLwotICAgIC8qIAorICAgIC8qCiAgICAgKiBUaGUgYXR0ci4gZGVjbC4gT1IgYSBRTmFtZS1yZWYuIHRvIGFuIGF0dHIuIGRlY2wuIE9SCiAgICAgKiBhIFFOYW1lLXJlZi4gdG8gYW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24uCiAgICAgKi8KQEAgLTU3Myw3ICs1NzMsNyBAQAogICAgIHhtbERpY3RQdHIgZGljdDsKICAgICB4bWxTY2hlbWFJdGVtTGlzdFB0ciBidWNrZXRzOyAvKiBMaXN0IG9mIHNjaGVtYSBidWNrZXRzLiAqLwogICAgIC8qIHhtbFNjaGVtYUl0ZW1MaXN0UHRyIHJlbGF0aW9uczsgKi8gLyogTGlzdCBvZiBzY2hlbWEgcmVsYXRpb25zLiAqLwotICAgIHhtbFNjaGVtYUJ1Y2tldFB0ciBidWNrZXQ7IC8qIFRoZSBjdXJyZW50IHNjaGVtYSBidWNrZXQgKi8gICAgCisgICAgeG1sU2NoZW1hQnVja2V0UHRyIGJ1Y2tldDsgLyogVGhlIGN1cnJlbnQgc2NoZW1hIGJ1Y2tldCAqLwogICAgIHhtbFNjaGVtYUl0ZW1MaXN0UHRyIHBlbmRpbmc7IC8qIEFsbCBDb21wb25lbnRzIG9mIGFsbCBzY2hlbWFzIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIGZpeGVkLiAqLwogICAgIHhtbEhhc2hUYWJsZVB0ciBzdWJzdEdyb3VwczsKQEAgLTYyOSw3ICs2MjksNyBAQAogICAgIHhtbFNjaGVtYUJ1Y2tldFB0ciByZWRlZmluZWQ7IC8qIFRoZSBzY2hlbWEgdG8gYmUgcmVkZWZpbmVkLiAqLwogCiAgICAgeG1sU2NoZW1hUmVkZWZQdHIgcmVkZWY7IC8qIFVzZWQgZm9yIHJlZGVmaW5pdGlvbnMuICovCi0gICAgaW50IHJlZGVmQ291bnRlcjsgLyogVXNlZCBmb3IgcmVkZWZpbml0aW9ucy4gKi8gCisgICAgaW50IHJlZGVmQ291bnRlcjsgLyogVXNlZCBmb3IgcmVkZWZpbml0aW9ucy4gKi8KICAgICB4bWxTY2hlbWFJdGVtTGlzdFB0ciBhdHRyUHJvaGliczsKIH07CiAKQEAgLTc4Myw3ICs3ODMsNyBAQAogICAgIHhtbE5vZGVQdHIgbm9kZTsKICAgICB4bWxTY2hlbWFQU1ZJSURDS2V5UHRyICprZXlzOwogICAgIGludCBub2RlTGluZTsKLSAgICBpbnQgbm9kZVFOYW1lSUQ7ICAgIAorICAgIGludCBub2RlUU5hbWVJRDsKIAogfTsKIApAQCAtODc5LDcgKzg3OSw3IEBACiBzdHJ1Y3QgX3htbFNjaGVtYU5vZGVJbmZvIHsKICAgICBpbnQgbm9kZVR5cGU7CiAgICAgeG1sTm9kZVB0ciBub2RlOwotICAgIGludCBub2RlTGluZTsgICAgCisgICAgaW50IG5vZGVMaW5lOwogICAgIGNvbnN0IHhtbENoYXIgKmxvY2FsTmFtZTsKICAgICBjb25zdCB4bWxDaGFyICpuc05hbWU7CiAgICAgY29uc3QgeG1sQ2hhciAqdmFsdWU7CkBAIC05MDEsNyArOTAxLDcgQEAKIAogICAgIGNvbnN0IHhtbENoYXIgKipuc0JpbmRpbmdzOyAvKiBOYW1lc3BhY2UgYmluZGluZ3Mgb24gdGhpcyBlbGVtZW50ICovCiAgICAgaW50IG5iTnNCaW5kaW5nczsKLSAgICBpbnQgc2l6ZU5zQmluZGluZ3M7ICAgIAorICAgIGludCBzaXplTnNCaW5kaW5nczsKIAogICAgIGludCBoYXNLZXlyZWZzOwogICAgIGludCBhcHBsaWVkWFBhdGg7IC8qIEluZGljYXRlcyB0aGF0IGFuIFhQYXRoIGhhcyBiZWVuIGFwcGxpZWQuICovCkBAIC05MzgsNyArOTM4LDcgQEAKIHN0cnVjdCBfeG1sU2NoZW1hQXR0ckluZm8gewogICAgIGludCBub2RlVHlwZTsKICAgICB4bWxOb2RlUHRyIG5vZGU7Ci0gICAgaW50IG5vZGVMaW5lOyAgICAKKyAgICBpbnQgbm9kZUxpbmU7CiAgICAgY29uc3QgeG1sQ2hhciAqbG9jYWxOYW1lOwogICAgIGNvbnN0IHhtbENoYXIgKm5zTmFtZTsKICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZTsKQEAgLTExNzIsNyArMTE3Miw3IEBACiAJICAgIGlmIChXWFNfSVNfQ09NUExFWChXWFNfVFlQRV9DQVNUIGl0ZW0pKQogCQlyZXR1cm4oQkFEX0NBU1QgImNvbXBsZXggdHlwZSBkZWZpbml0aW9uIik7CiAJICAgIGVsc2UKLQkJcmV0dXJuKEJBRF9DQVNUICJzaW1wbGUgdHlwZSBkZWZpbml0aW9uIik7CQorCQlyZXR1cm4oQkFEX0NBU1QgInNpbXBsZSB0eXBlIGRlZmluaXRpb24iKTsKIAlkZWZhdWx0OgogCSAgICByZXR1cm4oeG1sU2NoZW1hSXRlbVR5cGVUb1N0cihpdGVtLT50eXBlKSk7CiAgICAgfQpAQCAtMTMwMCwxMSArMTMwMCwxMSBAQAogCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgbG9jYWxOYW1lKTsKICAgICB9IGVsc2UgewogCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIihOVUxMKSIpOwotICAgIH0gICAgCisgICAgfQogICAgIHJldHVybiAoKGNvbnN0IHhtbENoYXIgKikgKmJ1Zik7CiB9CiAKLXN0YXRpYyBjb25zdCB4bWxDaGFyKiAgIAorc3RhdGljIGNvbnN0IHhtbENoYXIqCiB4bWxTY2hlbWFGb3JtYXRRTmFtZU5zKHhtbENoYXIgKipidWYsIHhtbE5zUHRyIG5zLCBjb25zdCB4bWxDaGFyICpsb2NhbE5hbWUpCiB7CiAgICAgaWYgKG5zICE9IE5VTEwpCkBAIC0xNDgwLDE2ICsxNDgwLDE2IEBACiAgICAgaW50IGxpc3Q7CiAgICAgeG1sU2NoZW1hVmFsVHlwZSB2YWxUeXBlOwogICAgIGNvbnN0IHhtbENoYXIgKnZhbHVlLCAqdmFsdWUyID0gTlVMTDsKLSAgICAKKwogCiAgICAgaWYgKChyZXRWYWx1ZSA9PSBOVUxMKSB8fCAodmFsID09IE5VTEwpKQogCXJldHVybiAoLTEpOwogICAgIGxpc3QgPSB4bWxTY2hlbWFWYWx1ZUdldE5leHQodmFsKSA/IDEgOiAwOwogICAgICpyZXRWYWx1ZSA9IE5VTEw7CiAgICAgZG8gewotCXZhbHVlID0gTlVMTDsJCi0JdmFsVHlwZSA9IHhtbFNjaGVtYUdldFZhbFR5cGUodmFsKTsgICAgCi0Jc3dpdGNoICh2YWxUeXBlKSB7CSAgICAKKwl2YWx1ZSA9IE5VTEw7CisJdmFsVHlwZSA9IHhtbFNjaGVtYUdldFZhbFR5cGUodmFsKTsKKwlzd2l0Y2ggKHZhbFR5cGUpIHsKIAkgICAgY2FzZSBYTUxfU0NIRU1BU19TVFJJTkc6CiAJICAgIGNhc2UgWE1MX1NDSEVNQVNfTk9STVNUUklORzoKIAkgICAgY2FzZSBYTUxfU0NIRU1BU19BTllTSU1QTEVUWVBFOgpAQCAtMTUwMiw3ICsxNTAyLDcgQEAKIAkJICAgIGlmICh2YWx1ZTIgIT0gTlVMTCkKIAkJCXZhbHVlID0gdmFsdWUyOwogCQl9Ci0JCWJyZWFrOwkgICAKKwkJYnJlYWs7CiAJICAgIGRlZmF1bHQ6CiAJCWlmICh4bWxTY2hlbWFHZXRDYW5vblZhbHVlKHZhbCwgJnZhbHVlMikgPT0gLTEpIHsKIAkJICAgIGlmICh2YWx1ZTIgIT0gTlVMTCkKQEAgLTE1NDAsMjkgKzE1NDAsMjkgQEAKICAqIEBidWY6IHRoZSBzdHJpbmcgYnVmZmVyCiAgKiBAaXRlbURlczogdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBpdGVtCiAgKiBAaXRlbU5hbWU6IHRoZSBuYW1lIG9mIHRoZSBpdGVtCi0gKiBAaXRlbTogdGhlIGl0ZW0gYXMgYW4gb2JqZWN0IAorICogQGl0ZW06IHRoZSBpdGVtIGFzIGFuIG9iamVjdAogICogQGl0ZW1Ob2RlOiB0aGUgbm9kZSBvZiB0aGUgaXRlbQogICogQGxvY2FsOiB0aGUgbG9jYWwgbmFtZQogICogQHBhcnNpbmc6IGlmIHRoZSBmdW5jdGlvbiBpcyB1c2VkIGR1cmluZyB0aGUgcGFyc2UKICAqCiAgKiBSZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGl0ZW0gdXNlZAotICogZm9yIGVycm9yIHJlcG9ydHMuIAorICogZm9yIGVycm9yIHJlcG9ydHMuCiAgKgotICogVGhlIGZvbGxvd2luZyBvcmRlciBpcyB1c2VkIHRvIGJ1aWxkIHRoZSByZXN1bHRpbmcgCisgKiBUaGUgZm9sbG93aW5nIG9yZGVyIGlzIHVzZWQgdG8gYnVpbGQgdGhlIHJlc3VsdGluZwogICogZGVzaWduYXRpb24gaWYgdGhlIGFyZ3VtZW50cyBhcmUgbm90IE5VTEw6CiAgKiAxYS4gSWYgaXRlbURlcyBub3QgTlVMTCAtPiBpdGVtRGVzCiAgKiAxYi4gSWYgKGl0ZW1EZXMgbm90IE5VTEwpIGFuZCAoaXRlbU5hbWUgbm90IE5VTEwpCiAgKiAgICAgLT4gaXRlbURlcyArIGl0ZW1OYW1lCiAgKiAyLiBJZiB0aGUgcHJlY2VkaW5nIHdhcyBOVUxMIGFuZCAoaXRlbSBub3QgTlVMTCkgLT4gaXRlbQogICogMy4gSWYgdGhlIHByZWNlZGluZyB3YXMgTlVMTCBhbmQgKGl0ZW1Ob2RlIG5vdCBOVUxMKSAtPiBpdGVtTm9kZQotICogCisgKgogICogSWYgdGhlIGl0ZW1Ob2RlIGlzIGFuIGF0dHJpYnV0ZSBub2RlLCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAgKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQuCiAgKgogICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZyBhbmQgc2V0cyBAYnVmIHRvIHRoZSByZXN1bHRpbmcgdmFsdWUuCi0gKi8gIAotc3RhdGljIHhtbENoYXIqICAgCi14bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KHhtbENoYXIgKipidWYsCQkgICAgIAorICovCitzdGF0aWMgeG1sQ2hhcioKK3htbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoeG1sQ2hhciAqKmJ1ZiwKIAkJICAgICBjb25zdCB4bWxDaGFyICppdGVtRGVzLAogCQkgICAgIHhtbFNjaGVtYUJhc2ljSXRlbVB0ciBpdGVtLAogCQkgICAgIHhtbE5vZGVQdHIgaXRlbU5vZGUpCkBAIC0xNTc0LDkgKzE1NzQsOSBAQAogCXhtbEZyZWUoKmJ1Zik7CiAJKmJ1ZiA9IE5VTEw7CiAgICAgfQotICAgICAgICAgICAgCisKICAgICBpZiAoaXRlbURlcyAhPSBOVUxMKSB7Ci0JKmJ1ZiA9IHhtbFN0cmR1cChpdGVtRGVzKTsJCisJKmJ1ZiA9IHhtbFN0cmR1cChpdGVtRGVzKTsKICAgICB9IGVsc2UgaWYgKGl0ZW0gIT0gTlVMTCkgewogCXN3aXRjaCAoaXRlbS0+dHlwZSkgewogCWNhc2UgWE1MX1NDSEVNQV9UWVBFX0JBU0lDOiB7CkBAIC0xNjM0LDcgKzE2MzQsNyBAQAogCSAgICBicmVhazsKIAljYXNlIFhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEVfVVNFOiB7CiAJCXhtbFNjaGVtYUF0dHJpYnV0ZVVzZVB0ciBhdXNlOwotCSAgICAKKwogCQlhdXNlID0gV1hTX0FUVFJfVVNFX0NBU1QgaXRlbTsKIAkJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiYXR0cmlidXRlIHVzZSAiKTsKIAkJaWYgKFdYU19BVFRSVVNFX0RFQ0woYXVzZSkgIT0gTlVMTCkgewpAQCAtMTY1MCw3ICsxNjUwLDcgQEAKIAkgICAgYnJlYWs7CiAJY2FzZSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFOiB7CiAJCXhtbFNjaGVtYUF0dHJpYnV0ZVB0ciBhdHRyOwotCSAgICAKKwogCQlhdHRyID0gKHhtbFNjaGVtYUF0dHJpYnV0ZVB0cikgaXRlbTsKIAkJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiYXR0cmlidXRlIGRlY2wuIik7CiAJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiAnIik7CkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogCWNhc2UgWE1MX1NDSEVNQV9UWVBFX0VMRU1FTlQ6IHsKIAkJeG1sU2NoZW1hRWxlbWVudFB0ciBlbGVtOwogCi0JCWVsZW0gPSAoeG1sU2NoZW1hRWxlbWVudFB0cikgaXRlbTsJICAgIAorCQllbGVtID0gKHhtbFNjaGVtYUVsZW1lbnRQdHIpIGl0ZW07CiAJCSpidWYgPSB4bWxTdHJkdXAoQkFEX0NBU1QgImVsZW1lbnQgZGVjbC4iKTsKIAkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiICciKTsKIAkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCB4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLApAQCAtMTY3Niw3ICsxNjc2LDcgQEAKIAkgICAgYnJlYWs7CiAJY2FzZSBYTUxfU0NIRU1BX1RZUEVfSURDX1VOSVFVRToKIAljYXNlIFhNTF9TQ0hFTUFfVFlQRV9JRENfS0VZOgotCWNhc2UgWE1MX1NDSEVNQV9UWVBFX0lEQ19LRVlSRUY6CQkKKwljYXNlIFhNTF9TQ0hFTUFfVFlQRV9JRENfS0VZUkVGOgogCSAgICBpZiAoaXRlbS0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfSURDX1VOSVFVRSkKIAkJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAidW5pcXVlICciKTsKIAkgICAgZWxzZSBpZiAoaXRlbS0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfSURDX0tFWSkKQEAgLTE3MzIsNyArMTczMiw3IEBACiAJZGVmYXVsdDoKIAkgICAgbmFtZWQgPSAwOwogCX0KLSAgICB9IGVsc2UgCisgICAgfSBlbHNlCiAJbmFtZWQgPSAwOwogCiAgICAgaWYgKChuYW1lZCA9PSAwKSAmJiAoaXRlbU5vZGUgIT0gTlVMTCkpIHsKQEAgLTE3NDAsNyArMTc0MCw3IEBACiAKIAlpZiAoaXRlbU5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKQogCSAgICBlbGVtID0gaXRlbU5vZGUtPnBhcmVudDsKLQllbHNlIAorCWVsc2UKIAkgICAgZWxlbSA9IGl0ZW1Ob2RlOwogCSpidWYgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIkVsZW1lbnQgJyIpOwogCWlmIChlbGVtLT5ucyAhPSBOVUxMKSB7CkBAIC0xNzUwLDcgKzE3NTAsNyBAQAogCX0gZWxzZQogCSAgICAqYnVmID0geG1sU3RyY2F0KCpidWYsIGVsZW0tPm5hbWUpOwogCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiciKTsKLQkKKwogICAgIH0KICAgICBpZiAoKGl0ZW1Ob2RlICE9IE5VTEwpICYmIChpdGVtTm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpKSB7CiAJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiLCBhdHRyaWJ1dGUgJyIpOwpAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICInIik7CiAgICAgfQogICAgIEZSRUVfQU5EX05VTEwoc3RyKQotICAgIAorCiAgICAgcmV0dXJuICgqYnVmKTsKIH0KIApAQCAtMTc4NiwxMyArMTc4NiwxMyBAQAogICAgIGludCByZXMsIGZvdW5kID0gMDsKIAogICAgIGlmICgqYnVmICE9IE5VTEwpCi0JeG1sRnJlZSgqYnVmKTsgICAgCisJeG1sRnJlZSgqYnVmKTsKICAgICAqYnVmID0gTlVMTDsKIAogICAgIGRvIHsKIAkvKgogCSogVXNlIHRoZSB3aGl0ZXNwYWNlIHR5cGUgb2YgdGhlIGJhc2UgdHlwZS4KLQkqLwkKKwkqLwogCXdzID0geG1sU2NoZW1hR2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUodHlwZS0+YmFzZVR5cGUpOwogCWZvciAoZmFjZXQgPSB0eXBlLT5mYWNldHM7IGZhY2V0ICE9IE5VTEw7IGZhY2V0ID0gZmFjZXQtPm5leHQpIHsKIAkgICAgaWYgKGZhY2V0LT50eXBlICE9IFhNTF9TQ0hFTUFfRkFDRVRfRU5VTUVSQVRJT04pCkBAIC0xODgxLDcgKzE4ODEsNyBAQAogICogQG1zZzogdGhlIGVycm9yIG1lc3NhZ2UKICAqIEBzdHIxOiBleHRyYSBkYXRhCiAgKiBAc3RyMjogZXh0cmEgZGF0YQotICogCisgKgogICogSGFuZGxlIGEgcGFyc2VyIGVycm9yCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0xOTE0LDcgKzE5MTQsNyBAQAogICogQG1zZzogdGhlIGVycm9yIG1lc3NhZ2UKICAqIEBzdHIxOiBleHRyYSBkYXRhCiAgKiBAc3RyMjogZXh0cmEgZGF0YQotICogCisgKgogICogSGFuZGxlIGEgcGFyc2VyIGVycm9yCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0xOTMzLDcgKzE5MzMsNyBAQAogICogeG1sU2NoZW1hUEVyckV4dDoKICAqIEBjdHh0OiB0aGUgcGFyc2luZyBjb250ZXh0CiAgKiBAbm9kZTogdGhlIGNvbnRleHQgbm9kZQotICogQGVycm9yOiB0aGUgZXJyb3IgY29kZSAKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKICAqIEBzdHJEYXRhMTogZXh0cmEgZGF0YQogICogQHN0ckRhdGEyOiBleHRyYSBkYXRhCiAgKiBAc3RyRGF0YTM6IGV4dHJhIGRhdGEKQEAgLTE5NDMsMTMgKzE5NDMsMTMgQEAKICAqIEBzdHIzOiAgZXh0cmEgcGFyYW1ldGVyIGZvciB0aGUgbWVzc2FnZSBkaXNwbGF5CiAgKiBAc3RyNDogIGV4dHJhIHBhcmFtZXRlciBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQogICogQHN0cjU6ICBleHRyYSBwYXJhbWV0ZXIgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKLSAqIAorICoKICAqIEhhbmRsZSBhIHBhcnNlciBlcnJvcgogICovCiBzdGF0aWMgdm9pZAogeG1sU2NoZW1hUEVyckV4dCh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgbm9kZSwgaW50IGVycm9yLAotCQljb25zdCB4bWxDaGFyICogc3RyRGF0YTEsIGNvbnN0IHhtbENoYXIgKiBzdHJEYXRhMiwgCi0JCWNvbnN0IHhtbENoYXIgKiBzdHJEYXRhMywgY29uc3QgY2hhciAqbXNnLCBjb25zdCB4bWxDaGFyICogc3RyMSwgCisJCWNvbnN0IHhtbENoYXIgKiBzdHJEYXRhMSwgY29uc3QgeG1sQ2hhciAqIHN0ckRhdGEyLAorCQljb25zdCB4bWxDaGFyICogc3RyRGF0YTMsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgeG1sQ2hhciAqIHN0cjEsCiAJCWNvbnN0IHhtbENoYXIgKiBzdHIyLCBjb25zdCB4bWxDaGFyICogc3RyMywgY29uc3QgeG1sQ2hhciAqIHN0cjQsCiAJCWNvbnN0IHhtbENoYXIgKiBzdHI1KQogewpAQCAtMTk2Nyw4ICsxOTY3LDggQEAKICAgICB9CiAgICAgX194bWxSYWlzZUVycm9yKHNjaGFubmVsLCBjaGFubmVsLCBkYXRhLCBjdHh0LCBub2RlLCBYTUxfRlJPTV9TQ0hFTUFTUCwKICAgICAgICAgICAgICAgICAgICAgZXJyb3IsIFhNTF9FUlJfRVJST1IsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIHN0ckRhdGExLCAoY29uc3QgY2hhciAqKSBzdHJEYXRhMiwgCi0JCSAgICAoY29uc3QgY2hhciAqKSBzdHJEYXRhMywgMCwgMCwgbXNnLCBzdHIxLCBzdHIyLCAKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgc3RyRGF0YTEsIChjb25zdCBjaGFyICopIHN0ckRhdGEyLAorCQkgICAgKGNvbnN0IGNoYXIgKikgc3RyRGF0YTMsIDAsIDAsIG1zZywgc3RyMSwgc3RyMiwKIAkJICAgIHN0cjMsIHN0cjQsIHN0cjUpOwogfQogCkBAIC0yMDE2LDcgKzIwMTYsNyBAQAogICogQHN0cjE6IGV4dHJhIGRhdGEKICAqIEBzdHIyOiBleHRyYSBkYXRhCiAgKiBAc3RyMzogZXh0cmEgZGF0YQotICogCisgKgogICogSGFuZGxlIGEgdmFsaWRhdGlvbiBlcnJvcgogICovCiBzdGF0aWMgdm9pZApAQCAtMjAyOCw4ICsyMDI4LDggQEAKIHsKICAgICB4bWxTdHJ1Y3R1cmVkRXJyb3JGdW5jIHNjaGFubmVsID0gTlVMTDsKICAgICB4bWxHZW5lcmljRXJyb3JGdW5jIGNoYW5uZWwgPSBOVUxMOwotICAgIHZvaWQgKmRhdGEgPSBOVUxMOyAgICAKLSAgICAKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKwogICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKIAlpZiAoY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfVkFMSURBVE9SKSB7CiAJICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCA9ICh4bWxTY2hlbWFWYWxpZEN0eHRQdHIpIGN0eHQ7CkBAIC0yMDM3LDcgKzIwMzcsNyBAQAogCSAgICBpZiAoZXJyb3JMZXZlbCAhPSBYTUxfRVJSX1dBUk5JTkcpIHsKIAkJdmN0eHQtPm5iZXJyb3JzKys7CiAJCXZjdHh0LT5lcnIgPSBlcnJvcjsKLQkJY2hhbm5lbCA9IHZjdHh0LT5lcnJvcjsJCQorCQljaGFubmVsID0gdmN0eHQtPmVycm9yOwogCSAgICB9IGVsc2UgewogCQljaGFubmVsID0gdmN0eHQtPndhcm5pbmc7CiAJICAgIH0KQEAgLTIwNzcsNyArMjA3Nyw3IEBACiAJCWVsc2UgaWYgKCh2Y3R4dC0+cGFyc2VyQ3R4dCAhPSBOVUxMKSAmJgogCQkgICAgKHZjdHh0LT5wYXJzZXJDdHh0LT5pbnB1dCAhPSBOVUxMKSkKIAkJICAgIGZpbGUgPSB2Y3R4dC0+cGFyc2VyQ3R4dC0+aW5wdXQtPmZpbGVuYW1lOwotCSAgICB9CSAgICAgICAKKwkgICAgfQogCSAgICBfX3htbFJhaXNlRXJyb3Ioc2NoYW5uZWwsIGNoYW5uZWwsIGRhdGEsIGN0eHQsCiAJCW5vZGUsIFhNTF9GUk9NX1NDSEVNQVNWLAogCQllcnJvciwgZXJyb3JMZXZlbCwgZmlsZSwgbGluZSwKQEAgLTIwODksNyArMjA4OSw3IEBACiAJICAgIGlmIChlcnJvckxldmVsICE9IFhNTF9FUlJfV0FSTklORykgewogCQlwY3R4dC0+bmJlcnJvcnMrKzsKIAkJcGN0eHQtPmVyciA9IGVycm9yOwotCQljaGFubmVsID0gcGN0eHQtPmVycm9yOwkJCisJCWNoYW5uZWwgPSBwY3R4dC0+ZXJyb3I7CiAJICAgIH0gZWxzZSB7CiAJCWNoYW5uZWwgPSBwY3R4dC0+d2FybmluZzsKIAkgICAgfQpAQCAtMjExNSwxMSArMjExNSwxMSBAQAogICogQHN0cjE6IGV4dHJhIGRhdGEKICAqIEBzdHIyOiBleHRyYSBkYXRhCiAgKiBAc3RyMzogZXh0cmEgZGF0YQotICogCisgKgogICogSGFuZGxlIGEgdmFsaWRhdGlvbiBlcnJvcgogICovCiBzdGF0aWMgdm9pZAoteG1sU2NoZW1hRXJyMyh4bWxTY2hlbWFBYnN0cmFjdEN0eHRQdHIgYWN0eHQsICAKK3htbFNjaGVtYUVycjMoeG1sU2NoZW1hQWJzdHJhY3RDdHh0UHRyIGFjdHh0LAogCSAgICAgIGludCBlcnJvciwgeG1sTm9kZVB0ciBub2RlLCBjb25zdCBjaGFyICptc2csCiAJICAgICAgY29uc3QgeG1sQ2hhciAqc3RyMSwgY29uc3QgeG1sQ2hhciAqc3RyMiwgY29uc3QgeG1sQ2hhciAqc3RyMykKIHsKQEAgLTIxMjgsNyArMjEyOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi14bWxTY2hlbWFFcnI0KHhtbFNjaGVtYUFic3RyYWN0Q3R4dFB0ciBhY3R4dCwgIAoreG1sU2NoZW1hRXJyNCh4bWxTY2hlbWFBYnN0cmFjdEN0eHRQdHIgYWN0eHQsCiAJICAgICAgaW50IGVycm9yLCB4bWxOb2RlUHRyIG5vZGUsIGNvbnN0IGNoYXIgKm1zZywKIAkgICAgICBjb25zdCB4bWxDaGFyICpzdHIxLCBjb25zdCB4bWxDaGFyICpzdHIyLAogCSAgICAgIGNvbnN0IHhtbENoYXIgKnN0cjMsIGNvbnN0IHhtbENoYXIgKnN0cjQpCkBAIC0yMTU3LDcgKzIxNTcsNyBAQAogCShub2RlLT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpICYmCiAJKG5vZGUtPnR5cGUgIT0gWE1MX0FUVFJJQlVURV9OT0RFKSkKICAgICB7Ci0JLyogCisJLyoKIAkqIERvbid0IHRyeSB0byBmb3JtYXQgb3RoZXIgbm9kZXMgdGhhbiBlbGVtZW50IGFuZAogCSogYXR0cmlidXRlIG5vZGVzLgogCSogUGxheSBzYXZlIGFuZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgpAQCAtMjE3MSw3ICsyMTcxLDcgQEAKIAkqLwogCWlmIChub2RlLT50eXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkgewogCSAgICB4bWxOb2RlUHRyIGVsZW0gPSBub2RlLT5wYXJlbnQ7Ci0JICAgIAorCiAJICAgICptc2cgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIkVsZW1lbnQgJyIpOwogCSAgICBpZiAoZWxlbS0+bnMgIT0gTlVMTCkKIAkJKm1zZyA9IHhtbFN0cmNhdCgqbXNnLCB4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLApAQCAtMjE4MSw3ICsyMTgxLDcgQEAKIAkJICAgIE5VTEwsIGVsZW0tPm5hbWUpKTsKIAkgICAgRlJFRV9BTkRfTlVMTChzdHIpOwogCSAgICAqbXNnID0geG1sU3RyY2F0KCptc2csIEJBRF9DQVNUICInLCAiKTsKLQkgICAgKm1zZyA9IHhtbFN0cmNhdCgqbXNnLCBCQURfQ0FTVCAiYXR0cmlidXRlICciKTsJICAgIAorCSAgICAqbXNnID0geG1sU3RyY2F0KCptc2csIEJBRF9DQVNUICJhdHRyaWJ1dGUgJyIpOwogCX0gZWxzZSB7CiAJICAgICptc2cgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIkVsZW1lbnQgJyIpOwogCX0KQEAgLTIxOTcsNyArMjE5Nyw3IEBACiAJeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZjdHh0ID0gKHhtbFNjaGVtYVZhbGlkQ3R4dFB0cikgYWN0eHQ7CiAJLyoKIAkqIFdvcmsgb24gbm9kZSBpbmZvcy4KLQkqLwkKKwkqLwogCWlmICh2Y3R4dC0+aW5vZGUtPm5vZGVUeXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkgewogCSAgICB4bWxTY2hlbWFOb2RlSW5mb1B0ciBpZWxlbSA9CiAJCXZjdHh0LT5lbGVtSW5mb3NbdmN0eHQtPmRlcHRoXTsKQEAgLTIyMDcsNyArMjIwNyw3IEBACiAJCWllbGVtLT5uc05hbWUsIGllbGVtLT5sb2NhbE5hbWUpKTsKIAkgICAgRlJFRV9BTkRfTlVMTChzdHIpOwogCSAgICAqbXNnID0geG1sU3RyY2F0KCptc2csIEJBRF9DQVNUICInLCAiKTsKLQkgICAgKm1zZyA9IHhtbFN0cmNhdCgqbXNnLCBCQURfQ0FTVCAiYXR0cmlidXRlICciKTsJICAgIAorCSAgICAqbXNnID0geG1sU3RyY2F0KCptc2csIEJBRF9DQVNUICJhdHRyaWJ1dGUgJyIpOwogCX0gZWxzZSB7CiAJICAgICptc2cgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIkVsZW1lbnQgJyIpOwogCX0KQEAgLTIyMTYsNyArMjIxNiw3IEBACiAJRlJFRV9BTkRfTlVMTChzdHIpOwogCSptc2cgPSB4bWxTdHJjYXQoKm1zZywgQkFEX0NBU1QgIic6ICIpOwogICAgIH0gZWxzZSBpZiAoYWN0eHQtPnR5cGUgPT0gWE1MX1NDSEVNQV9DVFhUX1BBUlNFUikgewotCS8qIAorCS8qCiAJKiBIbW0sIG5vIG5vZGUgd2hpbGUgcGFyc2luZz8KIAkqIFJldHVybiBhbiBlbXB0eSBzdHJpbmcsIGluIGNhc2UgTlVMTCB3aWxsIGJyZWFrIHNvbWV0aGluZy4KIAkqLwpAQCAtMjI1NCw3ICsyMjU0LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIG1zZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSW50ZXJuYWwgZXJyb3I6ICIpOwogICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUIGZ1bmNOYW1lKTsKLSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLCAiKTsgICAgCisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiwgIik7CiAgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgbWVzc2FnZSk7CiAgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi5cbiIpOwogCkBAIC0yMjYyLDcgKzIyNjIsNyBAQAogCXhtbFNjaGVtYUVycihhY3R4dCwgWE1MX1NDSEVNQVZfSU5URVJOQUwsIE5VTEwsCiAJICAgIChjb25zdCBjaGFyICopIG1zZywgc3RyMSwgc3RyMik7CiAKLSAgICBlbHNlIGlmIChhY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfUEFSU0VSKQkKKyAgICBlbHNlIGlmIChhY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfUEFSU0VSKQogCXhtbFNjaGVtYUVycihhY3R4dCwgWE1MX1NDSEVNQVBfSU5URVJOQUwsIE5VTEwsCiAJICAgIChjb25zdCBjaGFyICopIG1zZywgc3RyMSwgc3RyMik7CiAKQEAgLTIzMDksNyArMjMwOSw3IEBACiAgICAgfSBlbHNlCiAJeG1sU2NoZW1hRm9ybWF0Tm9kZUZvckVycm9yKCZtc2csIGFjdHh0LCBub2RlKTsKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKLSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7ICAgCisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi5cbiIpOwogICAgIHhtbFNjaGVtYUVycjQoYWN0eHQsIGVycm9yLCBub2RlLAogCShjb25zdCBjaGFyICopIG1zZywgc3RyMSwgc3RyMiwgc3RyMywgc3RyNCk7CiAgICAgRlJFRV9BTkRfTlVMTChtc2cpCkBAIC0yMzI1LDcgKzIzMjUsNyBAQAogCQkgICBjb25zdCB4bWxDaGFyICpzdHIyKQogewogICAgIHhtbFNjaGVtYUN1c3RvbUVycjQoYWN0eHQsIGVycm9yLCBub2RlLCBpdGVtLAotCW1lc3NhZ2UsIHN0cjEsIHN0cjIsIE5VTEwsIE5VTEwpOyAgICAKKwltZXNzYWdlLCBzdHIxLCBzdHIyLCBOVUxMLCBOVUxMKTsKIH0KIAogCkBAIC0yMzQ0LDggKzIzNDQsOCBAQAogCiAgICAgeG1sU2NoZW1hRm9ybWF0Tm9kZUZvckVycm9yKCZtc2csIGFjdHh0LCBub2RlKTsKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKLSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7IAotICAgIAorICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICIuXG4iKTsKKwogICAgIC8qIFVSR0VOVCBUT0RPOiBTZXQgdGhlIGVycm9yIGNvZGUgdG8gc29tZXRoaW5nIHNhbmUuICovCiAgICAgeG1sU2NoZW1hRXJyNExpbmUoYWN0eHQsIFhNTF9FUlJfV0FSTklORywgZXJyb3IsIG5vZGUsIDAsCiAJKGNvbnN0IGNoYXIgKikgbXNnLCBzdHIxLCBzdHIyLCBzdHIzLCBOVUxMKTsKQEAgLTIzNjUsMTUgKzIzNjUsMTUgQEAKIAkJICAgY29uc3QgeG1sQ2hhciAqc3RyMikKIHsKICAgICB4bWxDaGFyICptc2cgPSBOVUxMLCAqcW5hbWUgPSBOVUxMOwotICAgIAotICAgIG1zZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiRWxlbWVudCAnJXMnOiAiKTsgICAgICAgIAorCisgICAgbXNnID0geG1sU3RyZHVwKEJBRF9DQVNUICJFbGVtZW50ICclcyc6ICIpOwogICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIChjb25zdCB4bWxDaGFyICopIG1lc3NhZ2UpOwogICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICIuXG4iKTsKICAgICB4bWxTY2hlbWFFcnI0TGluZShBQ1RYVF9DQVNUIHZjdHh0LCBYTUxfRVJSX0VSUk9SLAogCWVycm9yLCBOVUxMLCBpZGNOb2RlLT5ub2RlTGluZSwgKGNvbnN0IGNoYXIgKikgbXNnLAogCXhtbFNjaGVtYUZvcm1hdFFOYW1lKCZxbmFtZSwKIAkgICAgdmN0eHQtPm5vZGVRTmFtZXMtPml0ZW1zW2lkY05vZGUtPm5vZGVRTmFtZUlEICsxXSwKLQkgICAgdmN0eHQtPm5vZGVRTmFtZXMtPml0ZW1zW2lkY05vZGUtPm5vZGVRTmFtZUlEXSksIAorCSAgICB2Y3R4dC0+bm9kZVFOYW1lcy0+aXRlbXNbaWRjTm9kZS0+bm9kZVFOYW1lSURdKSwKIAlzdHIxLCBzdHIyLCBOVUxMKTsKICAgICBGUkVFX0FORF9OVUxMKHFuYW1lKTsKICAgICBGUkVFX0FORF9OVUxMKG1zZyk7CkBAIC0yNDU2LDcgKzI0NTYsNyBAQAogCWlmICh0eXBlLT5idWlsdEluVHlwZSAhPSAwKSB7CiAJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJ4czoiKTsKIAkgICAgbXNnID0geG1sU3RyY2F0KG1zZywgdHlwZS0+bmFtZSk7Ci0JfSBlbHNlIAorCX0gZWxzZQogCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLAogCQl4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLAogCQkgICAgdHlwZS0+dGFyZ2V0TmFtZXNwYWNlLCB0eXBlLT5uYW1lKSk7CkBAIC0yNDk0LDEyICsyNDk0LDEyIEBACiAJCQl4bWxOb2RlUHRyIG5vZGUpCiB7CiAgICAgeG1sQ2hhciAqbXNnID0gTlVMTCwgKnN0ciA9IE5VTEw7Ci0gICAgCisKICAgICB4bWxTY2hlbWFGb3JtYXROb2RlRm9yRXJyb3IoJm1zZywgYWN0eHQsIG5vZGUpOwogICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJUaGUgYXR0cmlidXRlICclcycgaXMgbm90IGFsbG93ZWQuXG4iKTsKICAgICB4bWxTY2hlbWFFcnIoYWN0eHQsIGVycm9yLCBub2RlLCAoY29uc3QgY2hhciAqKSBtc2csCiAJeG1sU2NoZW1hRm9ybWF0RXJyb3JOb2RlUU5hbWUoJnN0ciwgKHhtbFNjaGVtYU5vZGVJbmZvUHRyKSBuaSwgbm9kZSksCi0JTlVMTCk7ICAgICAgICAKKwlOVUxMKTsKICAgICBGUkVFX0FORF9OVUxMKHN0cikKICAgICBGUkVFX0FORF9OVUxMKG1zZykKIH0KQEAgLTI1MTgsNyArMjUxOCw3IEBACiAgICAgeG1sQ2hhciAqbG9jYWxOYW1lLCAqbnNOYW1lOwogICAgIGNvbnN0IHhtbENoYXIgKmN1ciwgKmVuZDsKICAgICBpbnQgaTsKLSAgICAKKwogICAgIHhtbFNjaGVtYUZvcm1hdE5vZGVGb3JFcnJvcigmbXNnLCBhY3R4dCwgbm9kZSk7CiAgICAgbXNnID0geG1sU3RyY2F0KG1zZywgKGNvbnN0IHhtbENoYXIgKikgbWVzc2FnZSk7CiAgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi4iKTsKQEAgLTI1MzMsNyArMjUzMyw3IEBACiAJfSBlbHNlCiAJICAgIHN0ciA9IHhtbFN0cmR1cChCQURfQ0FTVCAiIEV4cGVjdGVkIGlzICggIik7CiAJbnNOYW1lID0gTlVMTDsKLSAgICAJICAgIAorCiAJZm9yIChpID0gMDsgaSA8IG5idmFsICsgbmJuZWc7IGkrKykgewogCSAgICBjdXIgPSB2YWx1ZXNbaV07CiAJICAgIGlmIChjdXIgPT0gTlVMTCkKQEAgLTI1NDcsNyArMjU0Nyw3IEBACiAJICAgICogR2V0IHRoZSBsb2NhbCBuYW1lLgogCSAgICAqLwogCSAgICBsb2NhbE5hbWUgPSBOVUxMOwotCSAgICAKKwogCSAgICBlbmQgPSBjdXI7CiAJICAgIGlmICgqZW5kID09ICcqJykgewogCQlsb2NhbE5hbWUgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIioiKTsKQEAgLTI1NTYsOCArMjU1Niw4IEBACiAJCXdoaWxlICgoKmVuZCAhPSAwKSAmJiAoKmVuZCAhPSAnfCcpKQogCQkgICAgZW5kKys7CiAJCWxvY2FsTmFtZSA9IHhtbFN0cm5jYXQobG9jYWxOYW1lLCBCQURfQ0FTVCBjdXIsIGVuZCAtIGN1cik7Ci0JICAgIH0JCQotCSAgICBpZiAoKmVuZCAhPSAwKSB7CQkgICAgCisJICAgIH0KKwkgICAgaWYgKCplbmQgIT0gMCkgewogCQllbmQrKzsKIAkJLyoKIAkJKiBTa2lwICIqfCoiIGlmIHRoZXkgY29tZSB3aXRoIG5lZ2F0ZWQgZXhwcmVzc2lvbnMsIHNpbmNlCkBAIC0yNTczLDEyICsyNTczLDEyIEBACiAJCSAgICB9IGVsc2UgewogCQkJd2hpbGUgKCplbmQgIT0gMCkKIAkJCSAgICBlbmQrKzsKLQkJCQorCiAJCQlpZiAoaSA+PSBuYnZhbCkKIAkJCSAgICBuc05hbWUgPSB4bWxTdHJkdXAoQkFEX0NBU1QgInsjI290aGVyOiIpOwogCQkJZWxzZQogCQkJICAgIG5zTmFtZSA9IHhtbFN0cmR1cChCQURfQ0FTVCAieyIpOwotCQkJCisKIAkJCW5zTmFtZSA9IHhtbFN0cm5jYXQobnNOYW1lLCBCQURfQ0FTVCBjdXIsIGVuZCAtIGN1cik7CiAJCQluc05hbWUgPSB4bWxTdHJjYXQobnNOYW1lLCBCQURfQ0FTVCAifSIpOwogCQkgICAgfQpAQCAtMjU4OCwxMyArMjU4OCwxMyBAQAogCQkgICAgRlJFRV9BTkRfTlVMTChsb2NhbE5hbWUpOwogCQkgICAgY29udGludWU7CiAJCX0KLQkgICAgfQkgICAgICAgIAorCSAgICB9CiAJICAgIHN0ciA9IHhtbFN0cmNhdChzdHIsIEJBRF9DQVNUIGxvY2FsTmFtZSk7CiAJICAgIEZSRUVfQU5EX05VTEwobG9jYWxOYW1lKTsKLQkJCisKIAkgICAgaWYgKGkgPCBuYnZhbCArIG5ibmVnIC0xKQogCQlzdHIgPSB4bWxTdHJjYXQoc3RyLCBCQURfQ0FTVCAiLCAiKTsKLQl9CQorCX0KIAlzdHIgPSB4bWxTdHJjYXQoc3RyLCBCQURfQ0FTVCAiICkuXG4iKTsKIAltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCBzdHIpOwogCUZSRUVfQU5EX05VTEwoc3RyKQpAQCAtMjYyNiw4ICsyNjI2LDggQEAKIAkvKgogCSogSWYgZW51bWVyYXRpb25zIGFyZSB2YWxpZGF0ZWQsIG9uZSBtdXN0IG5vdCBleHBlY3QgdGhlCiAJKiBmYWNldCB0byBiZSBnaXZlbi4KLQkqLwkKLSAgICB9IGVsc2UJCisJKi8KKyAgICB9IGVsc2UKIAlmYWNldFR5cGUgPSBmYWNldC0+dHlwZTsKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiWyIpOwogICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJmYWNldCAnIik7CkBAIC0yNjU1LDMxICsyNjU1LDMxIEBACiAJICAgIHNucHJpbnRmKGFjdExlbiwgMjQsICIlbHUiLCBsZW5ndGgpOwogCiAJICAgIGlmIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEgpCi0JCW1zZyA9IHhtbFN0cmNhdChtc2csIAotCQlCQURfQ0FTVCAidGhpcyBkaWZmZXJzIGZyb20gdGhlIGFsbG93ZWQgbGVuZ3RoIG9mICclcycuXG4iKTsgICAgIAorCQltc2cgPSB4bWxTdHJjYXQobXNnLAorCQlCQURfQ0FTVCAidGhpcyBkaWZmZXJzIGZyb20gdGhlIGFsbG93ZWQgbGVuZ3RoIG9mICclcycuXG4iKTsKIAkgICAgZWxzZSBpZiAoZmFjZXRUeXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfTUFYTEVOR1RIKQotCQltc2cgPSB4bWxTdHJjYXQobXNnLCAKKwkJbXNnID0geG1sU3RyY2F0KG1zZywKIAkJQkFEX0NBU1QgInRoaXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBtYXhpbXVtIGxlbmd0aCBvZiAnJXMnLlxuIik7CiAJICAgIGVsc2UgaWYgKGZhY2V0VHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX01JTkxFTkdUSCkKLQkJbXNnID0geG1sU3RyY2F0KG1zZywgCisJCW1zZyA9IHhtbFN0cmNhdChtc2csCiAJCUJBRF9DQVNUICJ0aGlzIHVuZGVycnVucyB0aGUgYWxsb3dlZCBtaW5pbXVtIGxlbmd0aCBvZiAnJXMnLlxuIik7Ci0JICAgIAorCiAJICAgIGlmIChub2RlVHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpCiAJCXhtbFNjaGVtYUVycjMoYWN0eHQsIGVycm9yLCBub2RlLCAoY29uc3QgY2hhciAqKSBtc2csCiAJCSAgICB2YWx1ZSwgKGNvbnN0IHhtbENoYXIgKikgYWN0TGVuLCAoY29uc3QgeG1sQ2hhciAqKSBsZW4pOwotCSAgICBlbHNlIAorCSAgICBlbHNlCiAJCXhtbFNjaGVtYUVycihhY3R4dCwgZXJyb3IsIG5vZGUsIChjb25zdCBjaGFyICopIG1zZywKIAkJICAgIChjb25zdCB4bWxDaGFyICopIGFjdExlbiwgKGNvbnN0IHhtbENoYXIgKikgbGVuKTsKLQkKKwogCX0gZWxzZSBpZiAoZmFjZXRUeXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfRU5VTUVSQVRJT04pIHsKIAkgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIlRoZSB2YWx1ZSAnJXMnIGlzIG5vdCBhbiBlbGVtZW50ICIKIAkJIm9mIHRoZSBzZXQgeyVzfS5cbiIpOwotCSAgICB4bWxTY2hlbWFFcnIoYWN0eHQsIGVycm9yLCBub2RlLCAoY29uc3QgY2hhciAqKSBtc2csIHZhbHVlLCAKKwkgICAgeG1sU2NoZW1hRXJyKGFjdHh0LCBlcnJvciwgbm9kZSwgKGNvbnN0IGNoYXIgKikgbXNnLCB2YWx1ZSwKIAkJeG1sU2NoZW1hRm9ybWF0RmFjZXRFbnVtU2V0KGFjdHh0LCAmc3RyLCB0eXBlKSk7CiAJfSBlbHNlIGlmIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9QQVRURVJOKSB7CiAJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJUaGUgdmFsdWUgJyVzJyBpcyBub3QgYWNjZXB0ZWQgIgogCQkiYnkgdGhlIHBhdHRlcm4gJyVzJy5cbiIpOwotCSAgICB4bWxTY2hlbWFFcnIoYWN0eHQsIGVycm9yLCBub2RlLCAoY29uc3QgY2hhciAqKSBtc2csIHZhbHVlLCAKKwkgICAgeG1sU2NoZW1hRXJyKGFjdHh0LCBlcnJvciwgbm9kZSwgKGNvbnN0IGNoYXIgKikgbXNnLCB2YWx1ZSwKIAkJZmFjZXQtPnZhbHVlKTsKIAl9IGVsc2UgaWYgKGZhY2V0VHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX01JTklOQ0xVU0lWRSkgewogCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIHZhbHVlICclcycgaXMgbGVzcyB0aGFuIHRoZSAiCkBAIC0yNzExLDEwICsyNzExLDEwIEBACiAJCSJkaWdpdHMgdGhhbiBhcmUgYWxsb3dlZCAoJyVzJykuXG4iKTsKIAkgICAgeG1sU2NoZW1hRXJyKGFjdHh0LCBlcnJvciwgbm9kZSwgKGNvbnN0IGNoYXIqKSBtc2csIHZhbHVlLAogCQlmYWNldC0+dmFsdWUpOwotCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7CQkKKwl9IGVsc2UgaWYgKG5vZGVUeXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkgewogCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIHZhbHVlICclcycgaXMgbm90IGZhY2V0LXZhbGlkLlxuIik7Ci0JICAgIHhtbFNjaGVtYUVycihhY3R4dCwgZXJyb3IsIG5vZGUsIChjb25zdCBjaGFyICopIG1zZywgdmFsdWUsIE5VTEwpOwkKLQl9IGVsc2UgewkgICAgCisJICAgIHhtbFNjaGVtYUVycihhY3R4dCwgZXJyb3IsIG5vZGUsIChjb25zdCBjaGFyICopIG1zZywgdmFsdWUsIE5VTEwpOworCX0gZWxzZSB7CiAJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJUaGUgdmFsdWUgaXMgbm90IGZhY2V0LXZhbGlkLlxuIik7CiAJICAgIHhtbFNjaGVtYUVycihhY3R4dCwgZXJyb3IsIG5vZGUsIChjb25zdCBjaGFyICopIG1zZywgTlVMTCwgTlVMTCk7CiAJfQpAQCAtMjcyMiw3ICsyNzIyLDcgQEAKIAltc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKIAltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7CiAJeG1sU2NoZW1hRXJyKGFjdHh0LCBlcnJvciwgbm9kZSwgKGNvbnN0IGNoYXIgKikgbXNnLCBzdHIxLCBzdHIyKTsKLSAgICB9ICAgICAgICAKKyAgICB9CiAgICAgRlJFRV9BTkRfTlVMTChzdHIpCiAgICAgeG1sRnJlZShtc2cpOwogfQpAQCAtMjk2Nyw5ICsyOTY3LDkgQEAKIAkJICAgIGNvbnN0IHhtbENoYXIgKnN0cjMsY29uc3QgeG1sQ2hhciAqc3RyNCkKIHsKICAgICB4bWxDaGFyICpzdHIgPSBOVUxMLCAqbXNnID0gTlVMTDsKLSAgICAKKwogICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJm1zZywgTlVMTCwgb3duZXJJdGVtLCBOVUxMKTsKLSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLCAiKTsgICAgCisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiwgIik7CiAgICAgbXNnID0geG1sU3RyY2F0KG1zZywKIAlCQURfQ0FTVCB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsCiAJV1hTX0JBU0lDX0NBU1QgYXR0cnVzZSwgTlVMTCkpOwpAQCAtMjk3Nyw3ICsyOTc3LDcgQEAKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiOiAiKTsKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKICAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7Ci0gICAgeG1sU2NoZW1hRXJyNChBQ1RYVF9DQVNUIGN0eHQsIGVycm9yLCBub2RlLCAKKyAgICB4bWxTY2hlbWFFcnI0KEFDVFhUX0NBU1QgY3R4dCwgZXJyb3IsIG5vZGUsCiAJKGNvbnN0IGNoYXIgKikgbXNnLCBzdHIxLCBzdHIyLCBzdHIzLCBzdHI0KTsKICAgICB4bWxGcmVlKG1zZyk7CiB9CkBAIC0zMDcxLDcgKzMwNzEsNyBAQAogICogQGVycm9yOiB0aGUgZXJyb3IgY29kZQogICogQHR5cGU6IHRoZSB0eXBlIHNwZWNpZmllcgogICogQG93bmVyRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIG93bmVyCi0gKiBAb3duZXJJdGVtOiB0aGUgc2NoZW1hIG9iamVjdCBpZiBleGlzdGVudCAKKyAqIEBvd25lckl0ZW06IHRoZSBzY2hlbWEgb2JqZWN0IGlmIGV4aXN0ZW50CiAgKiBAbm9kZTogdGhlIHZhbGlkYXRlZCBub2RlCiAgKiBAdmFsdWU6IHRoZSB2YWxpZGF0ZWQgdmFsdWUKICAqCkBAIC0zMDc5LDcgKzMwNzksNyBAQAogICogVE9ETzogU2hvdWxkIHRoaXMgcmVwb3J0IHRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IGFzIHdlbGw/CiAgKi8KIHN0YXRpYyB2b2lkCi14bWxTY2hlbWFQU2ltcGxlVHlwZUVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIAoreG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAogCQkJeG1sUGFyc2VyRXJyb3JzIGVycm9yLAogCQkJeG1sU2NoZW1hQmFzaWNJdGVtUHRyIG93bmVySXRlbSBBVFRSSUJVVEVfVU5VU0VELAogCQkJeG1sTm9kZVB0ciBub2RlLApAQCAtMzA5MSwzNyArMzA5MSwzNyBAQAogCQkJY29uc3QgeG1sQ2hhciAqc3RyMikKIHsKICAgICB4bWxDaGFyICptc2cgPSBOVUxMOwotICAgIAorCiAgICAgeG1sU2NoZW1hRm9ybWF0Tm9kZUZvckVycm9yKCZtc2csIEFDVFhUX0NBU1QgY3R4dCwgbm9kZSk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgewogCS8qCiAJKiBVc2UgZGVmYXVsdCBtZXNzYWdlcy4KLQkqLwkKKwkqLwogCWlmICh0eXBlICE9IE5VTEwpIHsKIAkgICAgaWYgKG5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKQogCQltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiJyVzJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBvZiAiKTsKIAkgICAgZWxzZQogCQltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIGNoYXJhY3RlciBjb250ZW50IGlzIG5vdCBhICIKLQkJInZhbGlkIHZhbHVlIG9mICIpOwkKKwkJInZhbGlkIHZhbHVlIG9mICIpOwogCSAgICBpZiAoISB4bWxTY2hlbWFJc0dsb2JhbEl0ZW0odHlwZSkpCiAJCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJ0aGUgbG9jYWwgIik7CiAJICAgIGVsc2UKIAkJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgInRoZSAiKTsKLQkgICAgCisKIAkgICAgaWYgKFdYU19JU19BVE9NSUModHlwZSkpCiAJCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJhdG9taWMgdHlwZSIpOwogCSAgICBlbHNlIGlmIChXWFNfSVNfTElTVCh0eXBlKSkKIAkJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgImxpc3QgdHlwZSIpOwogCSAgICBlbHNlIGlmIChXWFNfSVNfVU5JT04odHlwZSkpCiAJCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJ1bmlvbiB0eXBlIik7Ci0JICAgIAorCiAJICAgIGlmICh4bWxTY2hlbWFJc0dsb2JhbEl0ZW0odHlwZSkpIHsKIAkJeG1sQ2hhciAqc3RyID0gTlVMTDsKIAkJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiAnIik7CiAJCWlmICh0eXBlLT5idWlsdEluVHlwZSAhPSAwKSB7CiAJCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAieHM6Iik7CiAJCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCB0eXBlLT5uYW1lKTsKLQkJfSBlbHNlIAorCQl9IGVsc2UKIAkJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csCiAJCQl4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLAogCQkJICAgIHR5cGUtPnRhcmdldE5hbWVzcGFjZSwgdHlwZS0+bmFtZSkpOwpAQCAtMzEzNCw3ICszMTM0LDcgQEAKIAkgICAgZWxzZQogCQltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIGNoYXJhY3RlciBjb250ZW50IGlzIG5vdCAiCiAJCSJ2YWxpZC4iKTsKLQl9CQorCX0KIAlpZiAoZXhwZWN0ZWQpIHsKIAkgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiBFeHBlY3RlZCBpcyAnIik7CiAJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUIGV4cGVjdGVkKTsKQEAgLTMxNTEsNyArMzE1MSw3IEBACiAJeG1sU2NoZW1hUEVyckV4dChjdHh0LCBub2RlLCBlcnJvciwgTlVMTCwgTlVMTCwgTlVMTCwKIAkgICAgIChjb25zdCBjaGFyKikgbXNnLCBzdHIxLCBzdHIyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICB9Ci0gICAgLyogQ2xlYW51cC4gKi8gICAgCisgICAgLyogQ2xlYW51cC4gKi8KICAgICBGUkVFX0FORF9OVUxMKG1zZykKIH0KIApAQCAtMzM3Miw3ICszMzcyLDcgQEAKIAogc3RhdGljIGludAogeG1sU2NoZW1hSXRlbUxpc3RJbnNlcnQoeG1sU2NoZW1hSXRlbUxpc3RQdHIgbGlzdCwgdm9pZCAqaXRlbSwgaW50IGlkeCkKLXsgICAgCit7CiAgICAgaWYgKGxpc3QtPml0ZW1zID09IE5VTEwpIHsKIAlsaXN0LT5pdGVtcyA9ICh2b2lkICoqKSB4bWxNYWxsb2MoCiAJICAgIDIwICogc2l6ZW9mKHZvaWQgKikpOwpAQCAtMzQxMiw3ICszNDEyLDcgQEAKIAkJCSAgICBpbnQgaW5pdGlhbFNpemUsCiAJCQkgICAgdm9pZCAqaXRlbSwKIAkJCSAgICBpbnQgaWR4KQoteyAgICAKK3sKICAgICBpZiAobGlzdC0+aXRlbXMgPT0gTlVMTCkgewogCWlmIChpbml0aWFsU2l6ZSA8PSAwKQogCSAgICBpbml0aWFsU2l6ZSA9IDE7CkBAIC0zNDY3LDcgKzM0NjcsNyBAQAogCWxpc3QtPnNpemVJdGVtcyA9IDA7CiAgICAgfSBlbHNlIGlmIChsaXN0LT5uYkl0ZW1zIC0xID09IGlkeCkgewogCWxpc3QtPm5iSXRlbXMtLTsKLSAgICB9IGVsc2UgewkKKyAgICB9IGVsc2UgewogCWZvciAoaSA9IGlkeDsgaSA8IGxpc3QtPm5iSXRlbXMgLTE7IGkrKykKIAkgICAgbGlzdC0+aXRlbXNbaV0gPSBsaXN0LT5pdGVtc1tpKzFdOwogCWxpc3QtPm5iSXRlbXMtLTsKQEAgLTM1MDIsMTkgKzM1MDIsMTkgQEAKICAgICB9CiAgICAgaWYgKGJ1Y2tldC0+bG9jYWxzICE9IE5VTEwpIHsKIAl4bWxTY2hlbWFDb21wb25lbnRMaXN0RnJlZShidWNrZXQtPmxvY2Fscyk7Ci0JeG1sU2NoZW1hSXRlbUxpc3RGcmVlKGJ1Y2tldC0+bG9jYWxzKTsJCisJeG1sU2NoZW1hSXRlbUxpc3RGcmVlKGJ1Y2tldC0+bG9jYWxzKTsKICAgICB9CiAgICAgaWYgKGJ1Y2tldC0+cmVsYXRpb25zICE9IE5VTEwpIHsKIAl4bWxTY2hlbWFTY2hlbWFSZWxhdGlvblB0ciBwcmV2LCBjdXIgPSBidWNrZXQtPnJlbGF0aW9uczsKIAlkbyB7Ci0JICAgIHByZXYgPSBjdXI7CSAgICAKKwkgICAgcHJldiA9IGN1cjsKIAkgICAgY3VyID0gY3VyLT5uZXh0OwogCSAgICB4bWxGcmVlKHByZXYpOwogCX0gd2hpbGUgKGN1ciAhPSBOVUxMKTsKICAgICB9CiAgICAgaWYgKCghIGJ1Y2tldC0+cHJlc2VydmVEb2MpICYmIChidWNrZXQtPmRvYyAhPSBOVUxMKSkgewogCXhtbEZyZWVEb2MoYnVja2V0LT5kb2MpOwotICAgIH0gCisgICAgfQogICAgIGlmIChidWNrZXQtPnR5cGUgPT0gWE1MX1NDSEVNQV9TQ0hFTUFfSU1QT1JUKSB7CiAJaWYgKFdYU19JTVBCVUNLRVQoYnVja2V0KS0+c2NoZW1hICE9IE5VTEwpCiAJICAgIHhtbFNjaGVtYUZyZWUoV1hTX0lNUEJVQ0tFVChidWNrZXQpLT5zY2hlbWEpOwpAQCAtMzU1OSw3ICszNTU5LDcgQEAKIAl4bWxGcmVlKHJldCk7CiAJcmV0dXJuKE5VTEwpOwogICAgIH0KLSAgICAvKiAKKyAgICAvKgogICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFzc3VyZSB0aGF0IG9ubHkgdGhlIGZpcnN0IGJ1Y2tldCBpcyBtYXJrZWQgYXMKICAgICAqIFhNTF9TQ0hFTUFfU0NIRU1BX01BSU4gYW5kIGl0IHBvaW50cyB0byB0aGUgKm1haW4qIHNjaGVtYS4KICAgICAqIEZvciBlYWNoIGZvbGxvd2luZyBpbXBvcnQgYnVja2V0cyBhbiB4bWxTY2hlbWEgd2lsbCBiZSBjcmVhdGVkLgpAQCAtMzU3Myw3ICszNTczLDcgQEAKIAkgICAgeG1sU2NoZW1hQnVja2V0RnJlZShyZXQpOwogCSAgICByZXR1cm4oTlVMTCk7CiAJfQotCS8qIEZvcmNlIHRoZSB0eXBlIHRvIGJlIFhNTF9TQ0hFTUFfU0NIRU1BX01BSU4uICovIAorCS8qIEZvcmNlIHRoZSB0eXBlIHRvIGJlIFhNTF9TQ0hFTUFfU0NIRU1BX01BSU4uICovCiAJcmV0LT50eXBlID0gWE1MX1NDSEVNQV9TQ0hFTUFfTUFJTjsKIAkvKiBQb2ludCB0byB0aGUgKm1haW4qIHNjaGVtYS4gKi8KIAlXWFNfQ09OU1RSVUNUT1IocGN0eHQpLT5tYWluQnVja2V0ID0gcmV0OwpAQCAtMzU4MywxMiArMzU4MywxMiBAQAogCSovCiAJbWFpblNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwogICAgIH0gZWxzZSB7Ci0JaWYgKHR5cGUgPT0gWE1MX1NDSEVNQV9TQ0hFTUFfTUFJTikgewkgICAgCisJaWYgKHR5cGUgPT0gWE1MX1NDSEVNQV9TQ0hFTUFfTUFJTikgewogCSAgICBQRVJST1JfSU5UKCJ4bWxTY2hlbWFCdWNrZXRDcmVhdGUiLAogCQkibWFpbiBidWNrZXQgYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBvbmUiKTsKIAkgICAgeG1sU2NoZW1hQnVja2V0RnJlZShyZXQpOwogCSAgICByZXR1cm4oTlVMTCk7Ci0JfSBlbHNlIGlmICh0eXBlID09IFhNTF9TQ0hFTUFfU0NIRU1BX0lNUE9SVCkgewkgICAgCisJfSBlbHNlIGlmICh0eXBlID09IFhNTF9TQ0hFTUFfU0NIRU1BX0lNUE9SVCkgewogCSAgICAvKgogCSAgICAqIENyZWF0ZSBhIHNjaGVtYSBmb3IgaW1wb3J0cyBhbmQgYXNzaWduIHRoZQogCSAgICAqIHRhcmdldE5hbWVzcGFjZS4KQEAgLTM2MDAsNyArMzYwMCw3IEBACiAJICAgIH0KIAkgICAgV1hTX0lNUEJVQ0tFVChyZXQpLT5zY2hlbWEtPnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKIAl9Ci0gICAgfSAgICAKKyAgICB9CiAgICAgaWYgKFdYU19JU19CVUNLRVRfSU1QTUFJTih0eXBlKSkgewogCWludCByZXM7CiAJLyoKQEAgLTM2NDMsMTEgKzM2NDMsMTEgQEAKIAkgICAgaWYgKG1haW5TY2hlbWEtPmluY2x1ZGVzID09IE5VTEwpIHsKIAkJeG1sU2NoZW1hQnVja2V0RnJlZShyZXQpOwogCQlyZXR1cm4oTlVMTCk7Ci0JICAgIH0JICAgIAorCSAgICB9CiAJfQogCXhtbFNjaGVtYUl0ZW1MaXN0QWRkKG1haW5TY2hlbWEtPmluY2x1ZGVzLCByZXQpOwogICAgIH0KLSAgICAvKiAKKyAgICAvKgogICAgICogQWRkIHRvIGxpc3Qgb2YgYWxsIGJ1Y2tldHM7IHRoaXMgaXMgdXNlZCBmb3IgbG9va3VwCiAgICAgKiBkdXJpbmcgc2NoZW1hIGNvbnN0cnVjdGlvbiB0aW1lIG9ubHkuCiAgICAgKi8KQEAgLTQwMTUsNyArNDAxNSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5iSXRlbXM7IGkrKykgewogCSAgICBpdGVtID0gaXRlbXNbaV07CiAJICAgIGlmIChpdGVtID09IE5VTEwpCi0JCWNvbnRpbnVlOwkgICAgCisJCWNvbnRpbnVlOwogCSAgICBzd2l0Y2ggKGl0ZW0tPnR5cGUpIHsKIAkJY2FzZSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFOgogCQljYXNlIFhNTF9TQ0hFTUFfVFlQRV9DT01QTEVYOgpAQCAtNDEyMiw3ICs0MTIyLDcgQEAKIAl4bWxTY2hlbWFJdGVtTGlzdFB0ciBsaXN0ID0gKHhtbFNjaGVtYUl0ZW1MaXN0UHRyKSBzY2hlbWEtPmluY2x1ZGVzOwogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5uYkl0ZW1zOyBpKyspIHsKLQkgICAgeG1sU2NoZW1hQnVja2V0RnJlZSgoeG1sU2NoZW1hQnVja2V0UHRyKSBsaXN0LT5pdGVtc1tpXSk7CQorCSAgICB4bWxTY2hlbWFCdWNrZXRGcmVlKCh4bWxTY2hlbWFCdWNrZXRQdHIpIGxpc3QtPml0ZW1zW2ldKTsKIAl9CiAJeG1sU2NoZW1hSXRlbUxpc3RGcmVlKGxpc3QpOwogICAgIH0KQEAgLTQzMzAsNyArNDMzMCw3IEBACiAvKioKICAqIHhtbFNjaGVtYUF0dHJVc2VzRHVtcDoKICAqIEB1c2VzOiAgYXR0cmlidXRlIHVzZXMgbGlzdAotICogQG91dHB1dDogIHRoZSBmaWxlIG91dHB1dCAKKyAqIEBvdXRwdXQ6ICB0aGUgZmlsZSBvdXRwdXQKICAqCiAgKiBEdW1wcyBhIGxpc3Qgb2YgYXR0cmlidXRlIHVzZSBjb21wb25lbnRzLgogICovCkBAIC00MzQ3LDcgKzQzNDcsNyBAQAogICAgIGlmICgodXNlcyA9PSBOVUxMKSB8fCAodXNlcy0+bmJJdGVtcyA9PSAwKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZnByaW50ZihvdXRwdXQsICIgIGF0dHJpYnV0ZXM6XG4iKTsgICAgCisgICAgZnByaW50ZihvdXRwdXQsICIgIGF0dHJpYnV0ZXM6XG4iKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgdXNlcy0+bmJJdGVtczsgaSsrKSB7CiAJdXNlID0gdXNlcy0+aXRlbXNbaV07CiAJaWYgKHVzZS0+dHlwZSA9PSBYTUxfU0NIRU1BX0VYVFJBX0FUVFJfVVNFX1BST0hJQikgewpAQCAtNDUzMyw3ICs0NTMzLDcgQEAKIAlyZXR1cm47CiAgICAgZG8gewogCWZwcmludGYob3V0cHV0LCAiSURDOiAgIEJJTkRJTkcgJyVzJyAoJWQpXG4iLAotCSAgICB4bWxTY2hlbWFHZXRDb21wb25lbnRRTmFtZSgmc3RyLCAKKwkgICAgeG1sU2NoZW1hR2V0Q29tcG9uZW50UU5hbWUoJnN0ciwKIAkJYmluZC0+ZGVmaW5pdGlvbiksIGJpbmQtPm5iTm9kZXMpOwogCUZSRUVfQU5EX05VTEwoc3RyKQogCWZvciAoaSA9IDA7IGkgPCBiaW5kLT5uYk5vZGVzOyBpKyspIHsKQEAgLTQ2MzQsNyArNDYzNCw3IEBACiAgICAgeG1sQXR0clB0ciBwcm9wOwogCiAgICAgaWYgKChub2RlID09IE5VTEwpIHx8IChuYW1lID09IE5VTEwpKQotCXJldHVybihOVUxMKTsgICAgCisJcmV0dXJuKE5VTEwpOwogICAgIHByb3AgPSBub2RlLT5wcm9wZXJ0aWVzOwogICAgIHdoaWxlIChwcm9wICE9IE5VTEwpIHsKIAlpZiAoKHByb3AtPm5zICE9IE5VTEwpICYmCkBAIC00NzI5LDEyICs0NzI5LDEyIEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuc05hbWUpCiB7CiAgICAgeG1sU2NoZW1hRWxlbWVudFB0ciByZXQgPSBOVUxMOwotICAgIAorCiAgICAgaWYgKChuYW1lID09IE5VTEwpIHx8IChzY2hlbWEgPT0gTlVMTCkpCiAgICAgICAgIHJldHVybihOVUxMKTsKICAgICBpZiAoc2NoZW1hICE9IE5VTEwpIHsKIAlXWFNfRklORF9HTE9CQUxfSVRFTShlbGVtRGVjbCkKLSAgICB9ICAgCisgICAgfQogZXhpdDoKICNpZmRlZiBERUJVRwogICAgIGlmIChyZXQgPT0gTlVMTCkgewpAQCAtNDc2NSw5ICs0NzY1LDkgQEAKICAgICB4bWxTY2hlbWFUeXBlUHRyIHJldCA9IE5VTEw7CiAKICAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKE5VTEwpOyAgICAKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAvKiBGaXJzdCB0cnkgdGhlIGJ1aWx0LWluIHR5cGVzLiAqLwotICAgIGlmICgobnNOYW1lICE9IE5VTEwpICYmIHhtbFN0ckVxdWFsKG5zTmFtZSwgeG1sU2NoZW1hTnMpKSB7CQorICAgIGlmICgobnNOYW1lICE9IE5VTEwpICYmIHhtbFN0ckVxdWFsKG5zTmFtZSwgeG1sU2NoZW1hTnMpKSB7CiAJcmV0ID0geG1sU2NoZW1hR2V0UHJlZGVmaW5lZFR5cGUobmFtZSwgbnNOYW1lKTsKIAlpZiAocmV0ICE9IE5VTEwpCiAJICAgIGdvdG8gZXhpdDsKQEAgLTQ3ODAsNyArNDc4MCw3IEBACiAgICAgfQogICAgIGlmIChzY2hlbWEgIT0gTlVMTCkgewogCVdYU19GSU5EX0dMT0JBTF9JVEVNKHR5cGVEZWNsKQotICAgIH0gCisgICAgfQogZXhpdDoKIAogI2lmZGVmIERFQlVHCkBAIC00ODkxLDcgKzQ4OTEsNyBAQAogCVdYU19GSU5EX0dMT0JBTF9JVEVNKGdyb3VwRGVjbCkKICAgICB9CiBleGl0OgotICAgIAorCiAjaWZkZWYgREVCVUcKICAgICBpZiAocmV0ID09IE5VTEwpIHsKICAgICAgICAgaWYgKG5zTmFtZSA9PSBOVUxMKQpAQCAtNTAwMCw3ICs1MDAwLDcgQEAKIAlzdHIrKzsKIAlsZW4tLTsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gKDEpOwogfQogCkBAIC01MDYxLDcgKzUwNjEsNyBAQAogCQlkZWZhdWx0OgogCQkgICAgLyogU2hvdWxkIG5vdCBiZSBoaXQuICovCiAJCSAgICByZXR1cm4oTlVMTCk7Ci0JICAgIH0JCQorCSAgICB9CiAJfQogICAgIH0KIHN1YnNjaGVtYXM6CkBAIC01MjA5LDcgKzUyMDksNyBAQAogKiByZXNvbHZlIHJlZmVyZW5jZXMgdG8gdGhlIHJlZGVmaW5lZCBjb21wb25lbnRzIGFuZCB0byBjaGVjayBjb25zdHJhaW50cy4KICovCiBzdGF0aWMgeG1sU2NoZW1hUmVkZWZQdHIKLXhtbFNjaGVtYUFkZFJlZGVmKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgcGN0eHQsCQkgIAoreG1sU2NoZW1hQWRkUmVkZWYoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBwY3R4dCwKIAkJICB4bWxTY2hlbWFCdWNrZXRQdHIgdGFyZ2V0QnVja2V0LAogCQkgIHZvaWQgKml0ZW0sCiAJCSAgY29uc3QgeG1sQ2hhciAqcmVmTmFtZSwKQEAgLTUyNzIsNyArNTI3Miw3IEBACiAgICAgcmV0LT50eXBlID0gWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURUdST1VQOwogICAgIHJldC0+bmFtZSA9IG5hbWU7CiAgICAgcmV0LT50YXJnZXROYW1lc3BhY2UgPSBuc05hbWU7Ci0gICAgcmV0LT5ub2RlID0gbm9kZTsgICAKKyAgICByZXQtPm5vZGUgPSBub2RlOwogCiAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBmbGFnLiAqLwogICAgIHJldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfQVRUUkdST1VQX0dMT0JBTDsKQEAgLTUyODIsNyArNTI4Miw3IEBACiAJaWYgKHBjdHh0LT5yZWRlZiA9PSBOVUxMKSB7CiAJICAgIHhtbEZyZWUocmV0KTsKIAkgICAgcmV0dXJuKE5VTEwpOwotCX0JICAgIAorCX0KIAlwY3R4dC0+cmVkZWZDb3VudGVyID0gMDsKICAgICB9CiAgICAgV1hTX0FERF9HTE9CQUwocGN0eHQsIHJldCk7CkBAIC01MzcxLDEzICs1MzcxLDEzIEBACiAJICAgIGlmIChjdHh0LT5yZWRlZiA9PSBOVUxMKSB7CiAJCXhtbEZyZWUocmV0KTsKIAkJcmV0dXJuKE5VTEwpOwotCSAgICB9CSAgICAKKwkgICAgfQogCSAgICBjdHh0LT5yZWRlZkNvdW50ZXIgPSAwOwogCX0KIAlXWFNfQUREX0dMT0JBTChjdHh0LCByZXQpOwogICAgIH0gZWxzZQogCVdYU19BRERfTE9DQUwoY3R4dCwgcmV0KTsKLSAgICBXWFNfQUREX1BFTkRJTkcoY3R4dCwgcmV0KTsgICAgCisgICAgV1hTX0FERF9QRU5ESU5HKGN0eHQsIHJldCk7CiAgICAgcmV0dXJuIChyZXQpOwogfQogCkBAIC01NTA5LDcgKzU1MDksNyBAQAogICAgIHJldC0+Y2hpbGRyZW4gPSBOVUxMOwogCiAgICAgV1hTX0FERF9MT0NBTChjdHh0LCByZXQpOwotICAgIC8qIAorICAgIC8qCiAgICAgKiBOb3RlIHRoYXQgYWRkaXRpb24gdG8gcGVuZGluZyBjb21wb25lbnRzIHdpbGwgYmUgZG9uZSBsb2NhbGx5CiAgICAgKiB0byB0aGUgc3BlY2lmaWMgcGFyc2luZyBmdW5jdGlvbiwgc2luY2UgdGhlIG1vc3QgcGFydGljbGVzCiAgICAgKiBuZWVkIG5vdCB0byBiZSBmaXhlZCB1cCAoaS5lLiB0aGUgcmVmZXJlbmNlIHRvIGJlIHJlc29sdmVkKS4KQEAgLTU1NTgsNyArNTU1OCw3IEBACiAJaWYgKGN0eHQtPnJlZGVmID09IE5VTEwpIHsKIAkgICAgeG1sRnJlZShyZXQpOwogCSAgICByZXR1cm4oTlVMTCk7Ci0JfQkgICAgCisJfQogCWN0eHQtPnJlZGVmQ291bnRlciA9IDA7CiAgICAgfQogICAgIFdYU19BRERfR0xPQkFMKGN0eHQsIHJldCk7CkBAIC01NTk1LDcgKzU1OTUsNyBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbmFtZSwgY29uc3QgeG1sQ2hhciAqbnNOYW1lLAogCQkgIGludCBjYXRlZ29yeSwgeG1sTm9kZVB0ciBub2RlKQogewotICAgIHhtbFNjaGVtYUlEQ1B0ciByZXQgPSBOVUxMOyAgICAKKyAgICB4bWxTY2hlbWFJRENQdHIgcmV0ID0gTlVMTDsKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChuYW1lID09IE5VTEwpKQogICAgICAgICByZXR1cm4gKE5VTEwpOwpAQCAtNTYxMSw4ICs1NjExLDggQEAKICAgICByZXQtPnRhcmdldE5hbWVzcGFjZSA9IG5zTmFtZTsKICAgICByZXQtPm5hbWUgPSBuYW1lOwogICAgIHJldC0+dHlwZSA9IGNhdGVnb3J5OwotICAgIHJldC0+bm9kZSA9IG5vZGU7ICAgICAgICAKLSAgICAKKyAgICByZXQtPm5vZGUgPSBub2RlOworCiAgICAgV1hTX0FERF9HTE9CQUwoY3R4dCwgcmV0KTsKICAgICAvKgogICAgICogT25seSBrZXlyZWZzIG5lZWQgdG8gYmUgZml4dXAgdXAuCkBAIC01NjQ4LDcgKzU2NDgsNyBAQAogICAgIH0KICAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sU2NoZW1hV2lsZGNhcmQpKTsKICAgICByZXQtPnR5cGUgPSB0eXBlOwotICAgIHJldC0+bm9kZSA9IG5vZGU7ICAgIAorICAgIHJldC0+bm9kZSA9IG5vZGU7CiAgICAgV1hTX0FERF9MT0NBTChjdHh0LCByZXQpOwogICAgIHJldHVybiAocmV0KTsKIH0KQEAgLTU3MDQsNyArNTcwNCw3IEBACiBzdGF0aWMgeG1sU2NoZW1hU3Vic3RHcm91cFB0cgogeG1sU2NoZW1hU3Vic3RHcm91cEdldCh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHBjdHh0LAogCQkgICAgICAgeG1sU2NoZW1hRWxlbWVudFB0ciBoZWFkKQoteyAgIAorewogICAgIGlmIChXWFNfU1VCU1RfR1JPVVBTKHBjdHh0KSA9PSBOVUxMKQogCXJldHVybihOVUxMKTsKICAgICByZXR1cm4oeG1sSGFzaExvb2t1cDIoV1hTX1NVQlNUX0dST1VQUyhwY3R4dCksCkBAIC02MTIwLDcgKzYxMjAsNyBAQAogICAgIHZhbHVlID0geG1sTm9kZUdldENvbnRlbnQobm9kZSk7CiAgICAgLyoKICAgICAqIDMuMi4yLjEgTGV4aWNhbCByZXByZXNlbnRhdGlvbgotICAgICogQW4gaW5zdGFuY2Ugb2YgYSBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYXMgt2Jvb2xlYW63CisgICAgKiBBbiBpbnN0YW5jZSBvZiBhIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBhcyDvv71ib29sZWFu77+9CiAgICAgKiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGxlZ2FsIGxpdGVyYWxzIHt0cnVlLCBmYWxzZSwgMSwgMH0uCiAgICAgKi8KICAgICBpZiAoeG1sU3RyRXF1YWwoQkFEX0NBU1QgdmFsdWUsIEJBRF9DQVNUICJ0cnVlIikpCkBAIC02MTY4LDcgKzYxNjgsNyBAQAogICAgICAgICByZXR1cm4gKGRlZik7CiAgICAgLyoKICAgICAqIDMuMi4yLjEgTGV4aWNhbCByZXByZXNlbnRhdGlvbgotICAgICogQW4gaW5zdGFuY2Ugb2YgYSBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYXMgt2Jvb2xlYW63CisgICAgKiBBbiBpbnN0YW5jZSBvZiBhIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBhcyDvv71ib29sZWFu77+9CiAgICAgKiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGxlZ2FsIGxpdGVyYWxzIHt0cnVlLCBmYWxzZSwgMSwgMH0uCiAgICAgKi8KICAgICBpZiAoeG1sU3RyRXF1YWwodmFsLCBCQURfQ0FTVCAidHJ1ZSIpKQpAQCAtNjI4OCw3ICs2Mjg4LDcgQEAKIAkgICAgcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8yOwogCWVsc2UKIAkgICAgcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8xOwotCXhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKHBjdHh0LCAKKwl4bWxTY2hlbWFQU2ltcGxlVHlwZUVycihwY3R4dCwKIAkgICAgcmV0LCBvd25lckl0ZW0sICh4bWxOb2RlUHRyKSBhdHRyLAogCSAgICB0eXBlLCBOVUxMLCB2YWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgfQpAQCAtNjM1Miw3ICs2MzUyLDcgQEAKICAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgogICovCiBzdGF0aWMgaW50Ci14bWxTY2hlbWFQVmFsQXR0cih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCQkgICAgICAgCit4bWxTY2hlbWFQVmFsQXR0cih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCiAJCSAgICAgICB4bWxTY2hlbWFCYXNpY0l0ZW1QdHIgb3duZXJJdGVtLAogCQkgICAgICAgeG1sTm9kZVB0ciBvd25lckVsZW0sCiAJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLApAQCAtNjQ0Miw3ICs2NDQyLDcgQEAKICAqIEB0eXBlOiAgdGhlIGhvc3RpbmcgdHlwZSB3aGVyZSB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGFuY2hvcmVkCiAgKgogICogUGFyc2VzIGF0dHJpYnV0ZSB1c2VzIGFuZCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGFuZAotICogYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXMuIAorICogYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXMuCiAgKi8KIHN0YXRpYyBpbnQKIHhtbFNjaGVtYVBhcnNlTG9jYWxBdHRyaWJ1dGVzKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgeG1sU2NoZW1hUHRyIHNjaGVtYSwKQEAgLTcwODUsNyArNzA4NSw3IEBACiAJCQkgICAgIGludCBwYXJlbnRUeXBlKQogewogICAgIGNvbnN0IHhtbENoYXIgKmF0dHJWYWx1ZSwgKm5hbWUgPSBOVUxMLCAqbnMgPSBOVUxMOwotICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVVzZVB0ciB1c2UgPSBOVUxMOyAgICAKKyAgICB4bWxTY2hlbWFBdHRyaWJ1dGVVc2VQdHIgdXNlID0gTlVMTDsKICAgICB4bWxOb2RlUHRyIGNoaWxkID0gTlVMTDsKICAgICB4bWxBdHRyUHRyIGF0dHI7CiAgICAgY29uc3QgeG1sQ2hhciAqdG1wTnMgPSBOVUxMLCAqdG1wTmFtZSA9IE5VTEwsICpkZWZWYWx1ZSA9IE5VTEw7CkBAIC03MTM5LDcgKzcxMzksNyBAQAogCQkgICAgLyoKIAkJICAgICogRXZhbHVhdGUgdGhlIHRhcmdldCBuYW1lc3BhY2UKIAkJICAgICovCi0JCSAgICBoYXNGb3JtID0gMTsJCSAgICAKKwkJICAgIGhhc0Zvcm0gPSAxOwogCQkgICAgYXR0clZhbHVlID0geG1sU2NoZW1hR2V0Tm9kZUNvbnRlbnQocGN0eHQsCiAJCQkoeG1sTm9kZVB0cikgYXR0cik7CiAJCSAgICBpZiAoeG1sU3RyRXF1YWwoYXR0clZhbHVlLCBCQURfQ0FTVCAicXVhbGlmaWVkIikpIHsKQEAgLTcyMTAsNyArNzIxMCw3IEBACiAKIGF0dHJfbmV4dDoKIAlhdHRyID0gYXR0ci0+bmV4dDsKLSAgICB9ICAgICAgICAKKyAgICB9CiAgICAgLyoKICAgICAqIDMuMi4zIDogMgogICAgICogSWYgZGVmYXVsdCBhbmQgdXNlIGFyZSBib3RoIHByZXNlbnQsIHVzZSBtdXN0IGhhdmUKQEAgLTcyMzYsNyArNzIzNiw3IEBACiAKIAkvKiBUT0RPOiBtb3ZlIFhNTF9TQ0hFTUFTX1FVQUxJRl9BVFRSIHRvIHRoZSBwYXJzZXIuICovCiAJaWYgKCghIGhhc0Zvcm0pICYmIChzY2hlbWEtPmZsYWdzICYgWE1MX1NDSEVNQVNfUVVBTElGX0FUVFIpKQotCSAgICBucyA9IHBjdHh0LT50YXJnZXROYW1lc3BhY2U7CQkKKwkgICAgbnMgPSBwY3R4dC0+dGFyZ2V0TmFtZXNwYWNlOwogCS8qCiAJKiAzLjIuNiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IHhzaTogTm90IEFsbG93ZWQKIAkqIFRPRE86IE1vdmUgdGhpcyB0byB0aGUgY29tcG9uZW50IGxheWVyLgpAQCAtNzI5Myw3ICs3MjkzLDcgQEAKIAl1c2UtPmF0dHJEZWNsID0gYXR0ckRlY2w7CiAJLyoKIAkqIFZhbHVlIGNvbnN0cmFpbnQuCi0JKi8JCisJKi8KIAlpZiAoZGVmVmFsdWUgIT0gTlVMTCkgewogCSAgICBhdHRyRGVjbC0+ZGVmVmFsdWUgPSBkZWZWYWx1ZTsKIAkgICAgaWYgKGRlZlZhbHVlVHlwZSA9PSBXWFNfQVRUUl9ERUZfVkFMX0ZJWEVEKQpAQCAtNzMzMywxNCArNzMzMywxNCBAQAogCSAgICBpZiAoZGVmVmFsdWVUeXBlID09IFdYU19BVFRSX0RFRl9WQUxfRklYRUQpCiAJCXVzZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQV9BVFRSX1VTRV9GSVhFRDsKICAgICB9Ci0gICAgCisKIGNoZWNrX2NoaWxkcmVuOgogICAgIC8qCiAgICAgKiBBbmQgbm93IGZvciB0aGUgY2hpbGRyZW4uLi4KICAgICAqLwogICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CiAgICAgaWYgKG9jY3VycyA9PSBYTUxfU0NIRU1BU19BVFRSX1VTRV9QUk9ISUJJVEVEKSB7Ci0JeG1sU2NoZW1hQXR0cmlidXRlVXNlUHJvaGliUHRyIHByb2hpYjsJCisJeG1sU2NoZW1hQXR0cmlidXRlVXNlUHJvaGliUHRyIHByb2hpYjsKIAogCWlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKIAkgICAgeG1sU2NoZW1hUGFyc2VBbm5vdGF0aW9uKHBjdHh0LCBjaGlsZCwgMCk7CkBAIC03MzU1LDcgKzczNTUsNyBAQAogCS8qCiAJKiBDaGVjayBmb3IgcG9pbnRsZXNzbmVzcyBvZiBhdHRyaWJ1dGUgcHJvaGliaXRpb25zLgogCSovCi0JaWYgKHBhcmVudFR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURUdST1VQKSB7CQkKKwlpZiAocGFyZW50VHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFR1JPVVApIHsKIAkgICAgeG1sU2NoZW1hQ3VzdG9tV2FybmluZyhBQ1RYVF9DQVNUIHBjdHh0LAogCQlYTUxfU0NIRU1BUF9XQVJOX0FUVFJfUE9JTlRMRVNTX1BST0gsCiAJCW5vZGUsIE5VTEwsCkBAIC03MzczLDcgKzczNzMsNyBAQAogCSAgICByZXR1cm4oTlVMTCk7CiAJfQogCWlmICghIGlzUmVmKSB7Ci0JICAgIHRtcE5hbWUgPSBuYW1lOyAKKwkgICAgdG1wTmFtZSA9IG5hbWU7CiAJICAgIHRtcE5zID0gbnM7CiAJfQogCS8qCkBAIC03MzgxLDcgKzczODEsNyBAQAogCSovCiAJaWYgKHVzZXMpIHsKIAkgICAgaW50IGk7Ci0JICAgIAorCiAJICAgIGZvciAoaSA9IDA7IGkgPCB1c2VzLT5uYkl0ZW1zOyBpKyspIHsKIAkJdXNlID0gdXNlcy0+aXRlbXNbaV07CiAJCWlmICgodXNlLT50eXBlID09IFhNTF9TQ0hFTUFfRVhUUkFfQVRUUl9VU0VfUFJPSElCKSAmJgpAQCAtNzM4OSwxNiArNzM4OSwxNiBAQAogCQkgICAgKHRtcE5zID09IChXWFNfQVRUUl9QUk9ISUJfQ0FTVCB1c2UpLT50YXJnZXROYW1lc3BhY2UpKQogCQl7CiAJCSAgICB4bWxDaGFyICpzdHIgPSBOVUxMOwotCQkgICAgCisKIAkJICAgIHhtbFNjaGVtYUN1c3RvbVdhcm5pbmcoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJCVhNTF9TQ0hFTUFQX1dBUk5fQVRUUl9QT0lOVExFU1NfUFJPSCwKIAkJCW5vZGUsIE5VTEwsCiAJCQkiU2tpcHBpbmcgZHVwbGljYXRlIGF0dHJpYnV0ZSB1c2UgcHJvaGliaXRpb24gJyVzJyIsCiAJCQl4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLCB0bXBOcywgdG1wTmFtZSksCiAJCQlOVUxMLCBOVUxMKTsKLQkJICAgIEZSRUVfQU5EX05VTEwoc3RyKQkJCQorCQkgICAgRlJFRV9BTkRfTlVMTChzdHIpCiAJCSAgICByZXR1cm4oTlVMTCk7Ci0JCX0JCisJCX0KIAkgICAgfQogCX0KIAkvKgpAQCAtNzQxNyw3ICs3NDE3LDcgQEAKIAkgICAgV1hTX0FERF9QRU5ESU5HKHBjdHh0LCBwcm9oaWIpOwogCX0KIAlyZXR1cm4oV1hTX0JBU0lDX0NBU1QgcHJvaGliKTsKLSAgICB9IGVsc2UgeyAgICAgICAgCisgICAgfSBlbHNlIHsKIAlpZiAoSVNfU0NIRU1BKGNoaWxkLCAiYW5ub3RhdGlvbiIpKSB7CiAJICAgIC8qCiAJICAgICogVE9ETzogU2hvdWxkIHRoaXMgZ28gaW50byB0aGUgYXR0ciBkZWNsPwpAQCAtNzQ2NCw3ICs3NDY0LDcgQEAKIAkJTlVMTCwgbm9kZSwgY2hpbGQsIE5VTEwsCiAJCSIoYW5ub3RhdGlvbj8sIHNpbXBsZVR5cGU/KSIpOwogCX0KLSAgICB9ICAgCisgICAgfQogICAgIHJldHVybiAoV1hTX0JBU0lDX0NBU1QgdXNlKTsKIH0KIApAQCAtNzQ4Niw3ICs3NDg2LDcgQEAKICAgICAgKiAzLjIuMyBDb25zdHJhaW50cyBvbiBYTUwgUmVwcmVzZW50YXRpb25zIG9mIEF0dHJpYnV0ZSBEZWNsYXJhdGlvbnMKICAgICAgKi8KICAgICBpZiAoKHBjdHh0ID09IE5VTEwpIHx8IChzY2hlbWEgPT0gTlVMTCkgfHwgKG5vZGUgPT0gTlVMTCkpCi0gICAgICAgIHJldHVybiAoTlVMTCk7ICAgICAgICAKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAvKgogICAgICogMy4yLjMgOiAzLjEKICAgICAqIE9uZSBvZiByZWYgb3IgbmFtZSBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aApAQCAtNzUzMiw3ICs3NTMyLDcgQEAKICAgICBpZiAocmV0ID09IE5VTEwpCiAJcmV0dXJuIChOVUxMKTsKICAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0FUVFJfR0xPQkFMOwotCQorCiAgICAgLyoKICAgICAqIENoZWNrIGZvciBpbGxlZ2FsIGF0dHJpYnV0ZXMuCiAgICAgKi8KQEAgLTc1NDYsNyArNzU0Niw3IEBACiAJCSgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgInR5cGUiKSkpCiAJICAgIHsKIAkJeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKHBjdHh0LAotCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIE5VTEwsIGF0dHIpOwkJCisJCSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgTlVMTCwgYXR0cik7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGF0dHItPm5zLT5ocmVmLCB4bWxTY2hlbWFOcykpIHsKIAkgICAgeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKHBjdHh0LApAQCAtNzU1Niw3ICs3NTU2LDcgQEAKICAgICB9CiAgICAgeG1sU2NoZW1hUFZhbEF0dHJRTmFtZShwY3R4dCwgc2NoZW1hLCBOVUxMLAogCW5vZGUsICJ0eXBlIiwgJnJldC0+dHlwZU5zLCAmcmV0LT50eXBlTmFtZSk7Ci0gICAgCisKICAgICB4bWxTY2hlbWFQVmFsQXR0cklEKHBjdHh0LCBub2RlLCBCQURfQ0FTVCAiaWQiKTsKICAgICAvKgogICAgICogQXR0cmlidXRlICJmaXhlZCIuCkBAIC03NjQxLDEyICs3NjQxLDEyIEBACiAJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX01JU1NJTkcsCiAJICAgIE5VTEwsIG5vZGUsICJyZWYiLCBOVUxMKTsKIAlyZXR1cm4gKE5VTEwpOwotICAgIH0JCisgICAgfQogICAgIHhtbFNjaGVtYVBWYWxBdHRyTm9kZVFOYW1lKHBjdHh0LCBzY2hlbWEsCiAJTlVMTCwgYXR0ciwgJnJlZk5zLCAmcmVmKTsKICAgICBpZiAoeG1sU2NoZW1hQ2hlY2tSZWZlcmVuY2UocGN0eHQsIHNjaGVtYSwgbm9kZSwgYXR0ciwgcmVmTnMpICE9IDApCiAJcmV0dXJuKE5VTEwpOwotICAgCisKICAgICAvKgogICAgICogQ2hlY2sgZm9yIGlsbGVnYWwgYXR0cmlidXRlcy4KICAgICAqLwpAQCAtNzY5OCwxMyArNzY5OCwxMyBAQAogCS8qCiAJKiBTUEVDIHNyYy1yZWRlZmluZToKIAkqICg3LjEpICJJZiBpdCBoYXMgYW4gPGF0dHJpYnV0ZUdyb3VwPiBhbW9uZyBpdHMgY29udGVudHMKLQkqIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB3aG9zZSByZWYgW2F0dHJpYnV0ZV0gaXMgdGhlIHNhbWUKLQkqIGFzIHRoZSC3YWN0dWFsIHZhbHVltyBvZiBpdHMgb3duIG5hbWUgYXR0cmlidXRlIHBsdXMKKwkqIHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2Ygd2hvc2UgcmVmIFthdHRyaWJ1dGVdIGlzIHRoZSBzYW1lCisJKiBhcyB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIGl0cyBvd24gbmFtZSBhdHRyaWJ1dGUgcGx1cwogCSogdGFyZ2V0IG5hbWVzcGFjZSwgdGhlbiBpdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgc3VjaCBncm91cC4iCiAJKi8KIAlpZiAocGN0eHQtPnJlZGVmQ291bnRlciAhPSAwKSB7CiAJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JICAgIAorCiAJICAgIHhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIHBjdHh0LAogCQlYTUxfU0NIRU1BUF9TUkNfUkVERUZJTkUsIG5vZGUsIE5VTEwsCiAJCSJUaGUgcmVkZWZpbmluZyBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiAiCkBAIC03NzM4LDcgKzc3MzgsNyBAQAogCXJldC0+bm9kZSA9IG5vZGU7CiAJLyogQWRkIHRvIHBlbmRpbmcgaXRlbXMsIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSB0aGUgcmVmZXJlbmNlLiAqLwogCVdYU19BRERfUEVORElORyhwY3R4dCwgcmV0KTsKLSAgICB9ICAgIAorICAgIH0KICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTc3ODUsNyArNzc4NSw3IEBACiAgICAgcmV0ID0geG1sU2NoZW1hQWRkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKHBjdHh0LCBzY2hlbWEsCiAJbmFtZSwgcGN0eHQtPnRhcmdldE5hbWVzcGFjZSwgbm9kZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKQotCXJldHVybiAoTlVMTCk7CQorCXJldHVybiAoTlVMTCk7CiAgICAgLyoKICAgICAqIENoZWNrIGZvciBpbGxlZ2FsIGF0dHJpYnV0ZXMuCiAgICAgKi8KQEAgLTgxODUsNyArODE4NSw3IEBACiAgKiBSZXR1cm5zIHRoZSBwYXJzZWQgaWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uLgogICovCiBzdGF0aWMgeG1sU2NoZW1hSURDU2VsZWN0UHRyCi14bWxTY2hlbWFQYXJzZUlEQ1NlbGVjdG9yQW5kRmllbGQoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAkJCSAgCit4bWxTY2hlbWFQYXJzZUlEQ1NlbGVjdG9yQW5kRmllbGQoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAogCQkJICB4bWxTY2hlbWFJRENQdHIgaWRjLAogCQkJICB4bWxOb2RlUHRyIG5vZGUsCiAJCQkgIGludCBpc0ZpZWxkKQpAQCAtODg0OCw3ICs4ODQ4LDcgQEAKICAgICB0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfVU5JT047CiAgICAgLyoKICAgICAqIFNQRUMgKEJhc2UgdHlwZSkgKDIpICJJZiB0aGUgPGxpc3Q+IG9yIDx1bmlvbj4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLAotICAgICogdGhlbiB0aGUgt3NpbXBsZSB1ci10eXBlIGRlZmluaXRpb263LiIKKyAgICAqIHRoZW4gdGhlIO+/vXNpbXBsZSB1ci10eXBlIGRlZmluaXRpb27vv70uIgogICAgICovCiAgICAgdHlwZS0+YmFzZVR5cGUgPSB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShYTUxfU0NIRU1BU19BTllTSU1QTEVUWVBFKTsKICAgICAvKgpAQCAtOTAxNiw3ICs5MDE2LDcgQEAKICAgICB0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfTElTVDsKICAgICAvKgogICAgICogU1BFQyAoQmFzZSB0eXBlKSAoMikgIklmIHRoZSA8bGlzdD4gb3IgPHVuaW9uPiBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4sCi0gICAgKiB0aGVuIHRoZSC3c2ltcGxlIHVyLXR5cGUgZGVmaW5pdGlvbrcuIgorICAgICogdGhlbiB0aGUg77+9c2ltcGxlIHVyLXR5cGUgZGVmaW5pdGlvbu+/vS4iCiAgICAgKi8KICAgICB0eXBlLT5iYXNlVHlwZSA9IHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVNJTVBMRVRZUEUpOwogICAgIC8qCkBAIC05MTYxLDkgKzkxNjEsOSBAQAogICAgIH0KICAgICAvKgogICAgICogVGFyZ2V0TmFtZXNwYWNlOgotICAgICogU1BFQyAiVGhlILdhY3R1YWwgdmFsdWW3IG9mIHRoZSB0YXJnZXROYW1lc3BhY2UgW2F0dHJpYnV0ZV0KKyAgICAqIFNQRUMgIlRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2YgdGhlIHRhcmdldE5hbWVzcGFjZSBbYXR0cmlidXRlXQogICAgICogb2YgdGhlIDxzY2hlbWE+IGFuY2VzdG9yIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBpZiBwcmVzZW50LAotICAgICogb3RoZXJ3aXNlILdhYnNlbnS3LgorICAgICogb3RoZXJ3aXNlIO+/vWFic2VudO+/vS4KICAgICAqLwogICAgIGlmICh0b3BMZXZlbCA9PSAwKSB7CiAjaWZkZWYgRU5BQkxFX05BTUVEX0xPQ0FMUwpAQCAtOTE5NSw3ICs5MTk1LDcgQEAKIAkgICAgaWYgKGF0dHItPm5zID09IE5VTEwpIHsKIAkJaWYgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiaWQiKSkgewogCQkgICAgeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsCi0JCQlYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgTlVMTCwgYXR0cik7IAorCQkJWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIE5VTEwsIGF0dHIpOwogCQl9CiAJICAgIH0gZWxzZSBpZiAoeG1sU3RyRXF1YWwoYXR0ci0+bnMtPmhyZWYsIHhtbFNjaGVtYU5zKSkgewogCQkgICAgeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsCkBAIC05MjY2LDkgKzkyNjYsOSBAQAogICAgICogQW5kIG5vdyBmb3IgdGhlIGNoaWxkcmVuLi4uCiAgICAgKi8KICAgICBvbGRDdHh0VHlwZSA9IGN0eHQtPmN0eHRUeXBlOwotICAgIAorCiAgICAgY3R4dC0+Y3R4dFR5cGUgPSB0eXBlOwotICAgIAorCiAgICAgY2hpbGQgPSBub2RlLT5jaGlsZHJlbjsKICAgICBpZiAoSVNfU0NIRU1BKGNoaWxkLCAiYW5ub3RhdGlvbiIpKSB7CiAgICAgICAgIHR5cGUtPmFubm90ID0geG1sU2NoZW1hUGFyc2VBbm5vdGF0aW9uKGN0eHQsIGNoaWxkLCAxKTsKQEAgLTkyNzgsMTAgKzkyNzgsMTAgQEAKIAl4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LCBYTUxfU0NIRU1BUF9TNFNfRUxFTV9NSVNTSU5HLAogCSAgICBOVUxMLCBub2RlLCBjaGlsZCwgTlVMTCwKIAkgICAgIihhbm5vdGF0aW9uPywgKHJlc3RyaWN0aW9uIHwgbGlzdCB8IHVuaW9uKSkiKTsKLSAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgInJlc3RyaWN0aW9uIikpIHsJCisgICAgfSBlbHNlIGlmIChJU19TQ0hFTUEoY2hpbGQsICJyZXN0cmljdGlvbiIpKSB7CiAgICAgICAgIHhtbFNjaGVtYVBhcnNlUmVzdHJpY3Rpb24oY3R4dCwgc2NoZW1hLCBjaGlsZCwKLQkgICAgWE1MX1NDSEVNQV9UWVBFX1NJTVBMRSk7CQotCWhhc1Jlc3RyaWN0aW9uID0gMTsJCisJICAgIFhNTF9TQ0hFTUFfVFlQRV9TSU1QTEUpOworCWhhc1Jlc3RyaWN0aW9uID0gMTsKICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImxpc3QiKSkgewogICAgICAgICB4bWxTY2hlbWFQYXJzZUxpc3QoY3R4dCwgc2NoZW1hLCBjaGlsZCk7CkBAIC05Mjk4LDggKzkyOTgsOCBAQAogICAgIC8qCiAgICAgKiBSRURFRklORTogU1BFQyBzcmMtcmVkZWZpbmUgKDUpCiAgICAgKiAiV2l0aGluIHRoZSBbY2hpbGRyZW5dLCBlYWNoIDxzaW1wbGVUeXBlPiBtdXN0IGhhdmUgYQotICAgICogPHJlc3RyaWN0aW9uPiBhbW9uZyBpdHMgW2NoaWxkcmVuXSAuLi4gdGhlILdhY3R1YWwgdmFsdWW3IG9mIHdob3NlCi0gICAgKiBiYXNlIFthdHRyaWJ1dGVdIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlILdhY3R1YWwgdmFsdWW3IG9mIGl0cyBvd24KKyAgICAqIDxyZXN0cmljdGlvbj4gYW1vbmcgaXRzIFtjaGlsZHJlbl0gLi4uIHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2Ygd2hvc2UKKyAgICAqIGJhc2UgW2F0dHJpYnV0ZV0gbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIGl0cyBvd24KICAgICAqIG5hbWUgYXR0cmlidXRlIHBsdXMgdGFyZ2V0IG5hbWVzcGFjZTsiCiAgICAgKi8KICAgICBpZiAodG9wTGV2ZWwgJiYgY3R4dC0+aXNSZWRlZmluZSAmJiAoISBoYXNSZXN0cmljdGlvbikpIHsKQEAgLTkzMDcsNyArOTMwNyw3IEBACiAJICAgIE5VTEwsIG5vZGUsICJUaGlzIGlzIGEgcmVkZWZpbml0aW9uLCB0aHVzIHRoZSAiCiAJICAgICI8c2ltcGxlVHlwZT4gbXVzdCBoYXZlIGEgPHJlc3RyaWN0aW9uPiBjaGlsZCIsIE5VTEwpOwogICAgIH0KLSAgICAKKwogICAgIGN0eHQtPmN0eHRUeXBlID0gb2xkQ3R4dFR5cGU7CiAgICAgcmV0dXJuICh0eXBlKTsKIH0KQEAgLTkzNzMsMTMgKzkzNzMsMTMgQEAKICAgICB4bWxTY2hlbWFQVmFsQXR0cklEKGN0eHQsIG5vZGUsIEJBRF9DQVNUICJpZCIpOwogICAgIGl0ZW0gPSB4bWxTY2hlbWFBZGRQYXJ0aWNsZShjdHh0LCBub2RlLCBtaW4sIG1heCk7CiAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKLQlyZXR1cm4gKE5VTEwpOyAgICAKKwlyZXR1cm4gKE5VTEwpOwogICAgIC8qCiAgICAgKiBDcmVhdGUgYSBxbmFtZS1yZWZlcmVuY2UgYW5kIHNldCBhcyB0aGUgdGVybTsgaXQgd2lsbCBiZSBzdWJzdGl0dXRlZAogICAgICogZm9yIHRoZSBtb2RlbCBncm91cCBhZnRlciB0aGUgcmVmZXJlbmNlIGhhcyBiZWVuIHJlc29sdmVkLgogICAgICovCiAgICAgaXRlbS0+Y2hpbGRyZW4gPSAoeG1sU2NoZW1hVHJlZUl0ZW1QdHIpCi0JeG1sU2NoZW1hTmV3UU5hbWVSZWYoY3R4dCwgWE1MX1NDSEVNQV9UWVBFX0dST1VQLCByZWYsIHJlZk5zKTsgICAgCisJeG1sU2NoZW1hTmV3UU5hbWVSZWYoY3R4dCwgWE1MX1NDSEVNQV9UWVBFX0dST1VQLCByZWYsIHJlZk5zKTsKICAgICB4bWxTY2hlbWFQQ2hlY2tQYXJ0aWNsZUNvcnJlY3RfMihjdHh0LCBpdGVtLCBub2RlLCBtaW4sIG1heCk7CiAgICAgLyoKICAgICAqIEFuZCBub3cgZm9yIHRoZSBjaGlsZHJlbi4uLgpAQCAtOTQxOSw3ICs5NDE5LDcgQEAKICAqIE5vdGUgdGhhdCB0aGUgY29udHJhaW50IHNyYy1yZWRlZmluZSAoNi4yKSBjYW4ndCBiZSBhcHBsaWVkIHVudGlsCiAgKiByZWZlcmVuY2VzIGhhdmUgYmVlbiByZXNvbHZlZC4gU28gd2Ugd2lsbCBkbyB0aGlzIGF0IHRoZQogICogY29tcG9uZW50IGZpeHVwIGxldmVsLgotICogICAgCisgKgogICogKldBUk5JTkcqIHRoaXMgaW50ZXJmYWNlIGlzIGhpZ2hseSBzdWJqZWN0IHRvIGNoYW5nZQogICoKICAqIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgMCBpZiB0aGUgZGVjbGFyYXRpb24gaXMgaW1wcm9wZXIgYW5kCkBAIC05NDkzLDcgKzk0OTMsNyBAQAogCWNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgfQogCi0gICAKKwogCiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKIAl4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LApAQCAtOTYzMSw3ICs5NjMxLDcgQEAKICAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgInZlcnNpb24iKTsKICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAJcmVzID0geG1sU2NoZW1hUFZhbEF0dHJOb2RlKGN0eHQsIE5VTEwsIE5VTEwsIGF0dHIsCi0JICAgIHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX1RPS0VOKSwgJnZhbCk7ICAgIAorCSAgICB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShYTUxfU0NIRU1BU19UT0tFTiksICZ2YWwpOwogCUhGQUlMVVJFOwogICAgIH0KICAgICAqLwpAQCAtOTY5MSw3ICs5NjkxLDcgQEAKICAgICB9CiAgICAgYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJibG9ja0RlZmF1bHQiKTsKICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0JdmFsID0geG1sU2NoZW1hR2V0Tm9kZUNvbnRlbnQoY3R4dCwgKHhtbE5vZGVQdHIpIGF0dHIpOwkKKwl2YWwgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CiAJcmVzID0geG1sU2NoZW1hUFZhbEF0dHJCbG9ja0ZpbmFsKHZhbCwgJihzY2hlbWEtPmZsYWdzKSwgLTEsCiAJICAgIFhNTF9TQ0hFTUFTX0JMT0NLX0RFRkFVTFRfRVhURU5TSU9OLAogCSAgICBYTUxfU0NIRU1BU19CTE9DS19ERUZBVUxUX1JFU1RSSUNUSU9OLApAQCAtOTc1MiwxNCArOTc1MiwxNCBAQAogCSAgICBIRkFJTFVSRTsKIAkgICAgSFNUT1AoY3R4dCk7CiAJICAgIGlmICh0bXBPbGRFcnJzICE9IGN0eHQtPm5iZXJyb3JzKQotCQlnb3RvIGV4aXQ7CSAgICAKKwkJZ290byBleGl0OwogCX0gZWxzZSBpZiAoSVNfU0NIRU1BKGNoaWxkLCAiaW5jbHVkZSIpKSB7CiAJICAgIHRtcE9sZEVycnMgPSBjdHh0LT5uYmVycm9yczsKIAkgICAgcmVzID0geG1sU2NoZW1hUGFyc2VJbmNsdWRlKGN0eHQsIHNjaGVtYSwgY2hpbGQpOwogCSAgICBIRkFJTFVSRTsKIAkgICAgSFNUT1AoY3R4dCk7CiAJICAgIGlmICh0bXBPbGRFcnJzICE9IGN0eHQtPm5iZXJyb3JzKQotCQlnb3RvIGV4aXQ7CSAgICAKKwkJZ290byBleGl0OwogCX0gZWxzZSBpZiAoSVNfU0NIRU1BKGNoaWxkLCAicmVkZWZpbmUiKSkgewogCSAgICB0bXBPbGRFcnJzID0gY3R4dC0+bmJlcnJvcnM7CiAJICAgIHJlcyA9IHhtbFNjaGVtYVBhcnNlUmVkZWZpbmUoY3R4dCwgc2NoZW1hLCBjaGlsZCk7CkBAIC05ODg0LDcgKzk4ODQsNyBAQAogICAgIHhtbEZyZWUoY29uKTsKIH0KIAotc3RhdGljIHhtbFNjaGVtYUNvbnN0cnVjdGlvbkN0eHRQdHIgCitzdGF0aWMgeG1sU2NoZW1hQ29uc3RydWN0aW9uQ3R4dFB0cgogeG1sU2NoZW1hQ29uc3RydWN0aW9uQ3R4dENyZWF0ZSh4bWxEaWN0UHRyIGRpY3QpCiB7CiAgICAgeG1sU2NoZW1hQ29uc3RydWN0aW9uQ3R4dFB0ciByZXQ7CkBAIC05OTU0LDEwICs5OTU0LDEwIEBACiAgICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciByZXQ7CiAKICAgICByZXQgPSB4bWxTY2hlbWFQYXJzZXJDdHh0Q3JlYXRlKCk7Ci0gICAgaWYgKHJldCA9PSBOVUxMKSAgICAgICAgCisgICAgaWYgKHJldCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIHJldC0+ZGljdCA9IGRpY3Q7Ci0gICAgeG1sRGljdFJlZmVyZW5jZShkaWN0KTsgICAgCisgICAgeG1sRGljdFJlZmVyZW5jZShkaWN0KTsKICAgICBpZiAoVVJMICE9IE5VTEwpCiAJcmV0LT5VUkwgPSB4bWxEaWN0TG9va3VwKGRpY3QsIChjb25zdCB4bWxDaGFyICopIFVSTCwgLTEpOwogICAgIHJldHVybiAocmV0KTsKQEAgLTEwMDgyLDggKzEwMDgyLDggQEAKICAgICB4bWxOb2RlUHRyIG5vZGU7CiAgICAgaW50IHJldCwgb2xkRXJyczsKICAgICB4bWxTY2hlbWFCdWNrZXRQdHIgb2xkYnVja2V0ID0gcGN0eHQtPmNvbnN0cnVjdG9yLT5idWNrZXQ7Ci0gICAgCi0gICAgLyogCisKKyAgICAvKgogICAgICogU2F2ZSBvbGQgdmFsdWVzOyByZXNldCB0aGUgKm1haW4qIHNjaGVtYS4KICAgICAqIFVSR0VOVCBUT0RPOiBUaGlzIGlzIG5vdCBnb29kOyBtb3ZlIHRoZSBwZXItZG9jdW1lbnQgaW5mb3JtYXRpb24KICAgICAqIHRvIHRoZSBwYXJzZXIuIEdldCByaWQgb2YgcGFzc2luZyB0aGUgbWFpbiBzY2hlbWEgdG8gdGhlCkBAIC0xMDA5Myw5ICsxMDA5Myw5IEBACiAgICAgb2xkRG9jID0gc2NoZW1hLT5kb2M7CiAgICAgaWYgKHNjaGVtYS0+ZmxhZ3MgIT0gMCkKIAl4bWxTY2hlbWFDbGVhclNjaGVtYURlZmF1bHRzKHNjaGVtYSk7Ci0gICAgc2NoZW1hLT5kb2MgPSBidWNrZXQtPmRvYzsgICAgCisgICAgc2NoZW1hLT5kb2MgPSBidWNrZXQtPmRvYzsKICAgICBwY3R4dC0+c2NoZW1hID0gc2NoZW1hOwotICAgIC8qIAorICAgIC8qCiAgICAgKiBLZWVwIHRoZSBjdXJyZW50IHRhcmdldCBuYW1lc3BhY2Ugb24gdGhlIHBhcnNlciAqbm90KiBvbiB0aGUKICAgICAqIG1haW4gc2NoZW1hLgogICAgICovCkBAIC0xMDEwOCw3ICsxMDEwOCw3IEBACiAJKiBXZSBhcmUgcGFyc2luZyB0aGUgc2NoZW1hIGZvciBzY2hlbWFzIQogCSovCiAJcGN0eHQtPmlzUzRTID0gMTsKLSAgICB9ICAgIAorICAgIH0KICAgICAvKiBNYXJrIGl0IGFzIHBhcnNlZCwgZXZlbiBpZiBwYXJzaW5nIGZhaWxzLiAqLwogICAgIGJ1Y2tldC0+cGFyc2VkKys7CiAgICAgLyogQ29tcGlsZSB0aGUgc2NoZW1hIGRvYy4gKi8KQEAgLTEwMTMyLDcgKzEwMTMyLDcgQEAKIAlyZXQgPSBwY3R4dC0+ZXJyOwogCWdvdG8gZXhpdDsKICAgICB9Ci0gICAgCisKIGV4aXQ6CiAgICAgV1hTX0NPTlNUUlVDVE9SKHBjdHh0KS0+YnVja2V0ID0gb2xkYnVja2V0OwogICAgIC8qIFJlc3RvcmUgc2NoZW1hIHZhbHVlcy4gKi8KQEAgLTEwMTY1LDcgKzEwMTY1LDcgQEAKIAlQRVJST1JfSU5UKCJ4bWxTY2hlbWFQYXJzZU5ld0RvYyIsCiAJICAgICJubyBjb25zdHJ1Y3RvciIpOwogCXJldHVybigtMSk7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgLyogQ3JlYXRlIGFuZCBpbml0IHRoZSB0ZW1wb3JhcnkgcGFyc2VyIGNvbnRleHQuICovCiAgICAgbmV3cGN0eHQgPSB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0VXNlRGljdCgKIAkoY29uc3QgY2hhciAqKSBidWNrZXQtPnNjaGVtYUxvY2F0aW9uLCBwY3R4dC0+ZGljdCk7CkBAIC0xMDE3Myw3ICsxMDE3Myw3IEBACiAJcmV0dXJuKC0xKTsKICAgICBuZXdwY3R4dC0+Y29uc3RydWN0b3IgPSBwY3R4dC0+Y29uc3RydWN0b3I7CiAgICAgLyoKLSAgICAqIFRPRE86IENhbiB3ZSBhdm9pZCB0aGF0IHRoZSBwYXJzZXIga25vd3MgYWJvdXQgdGhlIG1haW4gc2NoZW1hPyAKKyAgICAqIFRPRE86IENhbiB3ZSBhdm9pZCB0aGF0IHRoZSBwYXJzZXIga25vd3MgYWJvdXQgdGhlIG1haW4gc2NoZW1hPwogICAgICogSXQgd291bGQgYmUgYmV0dGVyIGlmIGhlIGtub3dzIGFib3V0IHRoZSBjdXJyZW50IHNjaGVtYSBidWNrZXQKICAgICAqIG9ubHkuCiAgICAgKi8KQEAgLTEwMTgzLDE2ICsxMDE4MywxNiBAQAogICAgIHhtbFNjaGVtYVNldFBhcnNlclN0cnVjdHVyZWRFcnJvcnMobmV3cGN0eHQsIHBjdHh0LT5zZXJyb3IsCiAJcGN0eHQtPmVyckN0eHQpOwogICAgIG5ld3BjdHh0LT5jb3VudGVyID0gcGN0eHQtPmNvdW50ZXI7Ci0gICAgCisKIAogICAgIHJlcyA9IHhtbFNjaGVtYVBhcnNlTmV3RG9jV2l0aENvbnRleHQobmV3cGN0eHQsIHNjaGVtYSwgYnVja2V0KTsKLSAgICAKKwogICAgIC8qIENoYW5uZWwgYmFjayBlcnJvcnMgYW5kIGNsZWFudXAgdGhlIHRlbXBvcmFyeSBwYXJzZXIgY29udGV4dC4gKi8KICAgICBpZiAocmVzICE9IDApCiAJcGN0eHQtPmVyciA9IHJlczsKICAgICBwY3R4dC0+bmJlcnJvcnMgKz0gbmV3cGN0eHQtPm5iZXJyb3JzOwogICAgIHBjdHh0LT5jb3VudGVyID0gbmV3cGN0eHQtPmNvdW50ZXI7Ci0gICAgbmV3cGN0eHQtPmNvbnN0cnVjdG9yID0gTlVMTDsgICAgCisgICAgbmV3cGN0eHQtPmNvbnN0cnVjdG9yID0gTlVMTDsKICAgICAvKiBGcmVlIHRoZSBwYXJzZXIgY29udGV4dC4gKi8KICAgICB4bWxTY2hlbWFGcmVlUGFyc2VyQ3R4dChuZXdwY3R4dCk7CiAgICAgcmV0dXJuKHJlcyk7CkBAIC0xMDIxNywxMSArMTAyMTcsMTEgQEAKIHN0YXRpYyBjb25zdCB4bWxDaGFyICoKIHhtbFNjaGVtYUJ1aWxkQWJzb2x1dGVVUkkoeG1sRGljdFB0ciBkaWN0LCBjb25zdCB4bWxDaGFyKiBsb2NhdGlvbiwKIAkJCSAgeG1sTm9kZVB0ciBjdHh0Tm9kZSkKLXsgICAgCit7CiAgICAgLyoKICAgICAqIEJ1aWxkIGFuIGFic29sdWUgbG9jYXRpb24gVVJJLgogICAgICovCi0gICAgaWYgKGxvY2F0aW9uICE9IE5VTEwpIHsJCisgICAgaWYgKGxvY2F0aW9uICE9IE5VTEwpIHsKIAlpZiAoY3R4dE5vZGUgPT0gTlVMTCkKIAkgICAgcmV0dXJuKGxvY2F0aW9uKTsKIAllbHNlIHsKQEAgLTEwMjQ0LDcgKzEwMjQ0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuKE5VTEwpOwogfQotICAgIAorCiAKIAogLyoqCkBAIC0xMDI2Nyw4ICsxMDI2Nyw4IEBACiAJCWNvbnN0IGNoYXIgKnNjaGVtYUJ1ZmZlciwKIAkJaW50IHNjaGVtYUJ1ZmZlckxlbiwKIAkJeG1sTm9kZVB0ciBpbnZva2luZ05vZGUsCi0JCWNvbnN0IHhtbENoYXIgKnNvdXJjZVRhcmdldE5hbWVzcGFjZSwJCQotCQljb25zdCB4bWxDaGFyICppbXBvcnROYW1lc3BhY2UsCQorCQljb25zdCB4bWxDaGFyICpzb3VyY2VUYXJnZXROYW1lc3BhY2UsCisJCWNvbnN0IHhtbENoYXIgKmltcG9ydE5hbWVzcGFjZSwKIAkJeG1sU2NoZW1hQnVja2V0UHRyICpidWNrZXQpCiB7CiAgICAgY29uc3QgeG1sQ2hhciAqdGFyZ2V0TmFtZXNwYWNlID0gTlVMTDsKQEAgLTEwMjc5LDcgKzEwMjc5LDcgQEAKIAogICAgIGlmIChidWNrZXQgIT0gTlVMTCkKIAkqYnVja2V0ID0gTlVMTDsKLSAgICAKKwogICAgIHN3aXRjaCAodHlwZSkgewogCWNhc2UgWE1MX1NDSEVNQV9TQ0hFTUFfSU1QT1JUOgogCWNhc2UgWE1MX1NDSEVNQV9TQ0hFTUFfTUFJTjoKQEAgLTEwMjkxLDIzICsxMDI5MSwyMyBAQAogCWNhc2UgWE1MX1NDSEVNQV9TQ0hFTUFfUkVERUZJTkU6CiAJICAgIGVyciA9IFhNTF9TQ0hFTUFQX1NSQ19SRURFRklORTsKIAkgICAgYnJlYWs7Ci0gICAgfSAgICAKLSAgICAgICAKKyAgICB9CisKIAogICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBtYWluIHNjaGVtYToKICAgICAqIHNraXAgdGhlIGxvY2F0aW9uIGFuZCByZWxhdGlvbiBsb2dpYyBhbmQganVzdCBwYXJzZSB0aGUgZG9jLgogICAgICogV2UgbmVlZCBqdXN0IGEgYnVja2V0IHRvIGJlIHJldHVybmVkIGluIHRoaXMgY2FzZS4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIGlmICgodHlwZSA9PSBYTUxfU0NIRU1BX1NDSEVNQV9NQUlOKSB8fCAoISBXWFNfSEFTX0JVQ0tFVFMocGN0eHQpKSkKLQlnb3RvIGRvY19sb2FkOwkKKwlnb3RvIGRvY19sb2FkOwogCi0gICAgLyogTm90ZSB0aGF0IHdlIGV4cGVjdCB0aGUgbG9jYXRpb24gdG8gYmUgYW4gYWJzdWx1dGUgVVJJLiAqLyAKKyAgICAvKiBOb3RlIHRoYXQgd2UgZXhwZWN0IHRoZSBsb2NhdGlvbiB0byBiZSBhbiBhYnN1bHV0ZSBVUkkuICovCiAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IE5VTEwpIHsKIAlia3QgPSB4bWxTY2hlbWFHZXRTY2hlbWFCdWNrZXQocGN0eHQsIHNjaGVtYUxvY2F0aW9uKTsKIAlpZiAoKGJrdCAhPSBOVUxMKSAmJgogCSAgICAocGN0eHQtPmNvbnN0cnVjdG9yLT5idWNrZXQgPT0gYmt0KSkgewogCSAgICAvKiBSZXBvcnQgc2VsZi1pbXBvcnRzL2luY2x1c2lvbnMvcmVkZWZpbml0aW9ucy4gKi8KLQkgICAgCisKIAkgICAgeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgcGN0eHQsIGVyciwKIAkJaW52b2tpbmdOb2RlLCBOVUxMLAogCQkiVGhlIHNjaGVtYSBtdXN0IG5vdCBpbXBvcnQvaW5jbHVkZS9yZWRlZmluZSBpdHNlbGYiLApAQCAtMTAzMjAsNyArMTAzMjAsNyBAQAogICAgICovCiAgICAgcmVsYXRpb24gPSB4bWxTY2hlbWFTY2hlbWFSZWxhdGlvbkNyZWF0ZSgpOwogICAgIGlmIChyZWxhdGlvbiA9PSBOVUxMKQotCXJldHVybigtMSk7ICAgIAorCXJldHVybigtMSk7CiAgICAgeG1sU2NoZW1hU2NoZW1hUmVsYXRpb25BZGRDaGlsZChwY3R4dC0+Y29uc3RydWN0b3ItPmJ1Y2tldCwKIAlyZWxhdGlvbik7CiAgICAgcmVsYXRpb24tPnR5cGUgPSB0eXBlOwpAQCAtMTAzMjksNyArMTAzMjksNyBAQAogICAgICogU2F2ZSB0aGUgbmFtZXNwYWNlIGltcG9ydCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgIGlmIChXWFNfSVNfQlVDS0VUX0lNUE1BSU4odHlwZSkpIHsKLQlyZWxhdGlvbi0+aW1wb3J0TmFtZXNwYWNlID0gaW1wb3J0TmFtZXNwYWNlOwkKKwlyZWxhdGlvbi0+aW1wb3J0TmFtZXNwYWNlID0gaW1wb3J0TmFtZXNwYWNlOwogCWlmIChzY2hlbWFMb2NhdGlvbiA9PSBOVUxMKSB7CiAJICAgIC8qCiAJICAgICogTm8gbG9jYXRpb247IHRoaXMgaXMganVzdCBhbiBpbXBvcnQgb2YgdGhlIG5hbWVzcGFjZS4KQEAgLTEwMzQyLDcgKzEwMzQyLDcgQEAKICAgICB9CiAKICAgICAvKiBEaWQgd2UgYWxyZWFkeSBmZXRjaCB0aGUgZG9jPyAqLwotICAgIGlmIChia3QgIT0gTlVMTCkgewkJCisgICAgaWYgKGJrdCAhPSBOVUxMKSB7CiAJLyogVE9ETzogVGhlIGZvbGxvd2luZyBuYXN0eSBjYXNlcyB3aWxsIHByb2R1Y2UgYW4gZXJyb3IuICovCiAJaWYgKChXWFNfSVNfQlVDS0VUX0lNUE1BSU4odHlwZSkpICYmICghIGJrdC0+aW1wb3J0ZWQpKSB7CiAJICAgIC8qIFdlIGluY2x1ZGVkL3JlZGVmaW5lZCBhbmQgdGhlbiB0cnkgdG8gaW1wb3J0IGEgc2NoZW1hLiAqLwpAQCAtMTAzNjQsMTQgKzEwMzY0LDE0IEBACiAJCSJyZWRlZmluZWQsIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGltcG9ydGVkIiwKIAkJc2NoZW1hTG9jYXRpb24sIE5VTEwpOwogCSAgICBnb3RvIGV4aXQ7Ci0JfQkKKwl9CiAgICAgfQotICAgIAkKKwogICAgIGlmIChXWFNfSVNfQlVDS0VUX0lNUE1BSU4odHlwZSkpIHsKIAkvKgogCSogR2l2ZW4gdGhhdCB0aGUgc2NoZW1hTG9jYXRpb24gW2F0dHJpYnV0ZV0gaXMgb25seSBhIGhpbnQsIGl0IGlzIG9wZW4KIAkqIHRvIGFwcGxpY2F0aW9ucyB0byBpZ25vcmUgYWxsIGJ1dCB0aGUgZmlyc3QgPGltcG9ydD4gZm9yIGEgZ2l2ZW4KLQkqIG5hbWVzcGFjZSwgcmVnYXJkbGVzcyBvZiB0aGUgt2FjdHVhbCB2YWx1Zbcgb2Ygc2NoZW1hTG9jYXRpb24sIGJ1dAorCSogbmFtZXNwYWNlLCByZWdhcmRsZXNzIG9mIHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2Ygc2NoZW1hTG9jYXRpb24sIGJ1dAogCSogc3VjaCBhIHN0cmF0ZWd5IHJpc2tzIG1pc3NpbmcgdXNlZnVsIGluZm9ybWF0aW9uIHdoZW4gbmV3CiAJKiBzY2hlbWFMb2NhdGlvbnMgYXJlIG9mZmVyZWQuCiAJKgpAQCAtMTAzODcsNyArMTAzODcsNyBAQAogCSogNSBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIG5hbWVzcGFjZSBuYW1lIHRvIGxvY2F0ZSBzdWNoIGEgcmVzb3VyY2UuCiAJKgogCSogTk9URTogKDMpIGFuZCAoNSkgYXJlIG5vdCBzdXBwb3J0ZWQuCi0JKi8JCisJKi8KIAlpZiAoYmt0ICE9IE5VTEwpIHsKIAkgICAgcmVsYXRpb24tPmJ1Y2tldCA9IGJrdDsKIAkgICAgZ290byBleGl0OwpAQCAtMTAzOTUsNyArMTAzOTUsNyBAQAogCWJrdCA9IHhtbFNjaGVtYUdldFNjaGVtYUJ1Y2tldEJ5VE5TKHBjdHh0LAogCSAgICBpbXBvcnROYW1lc3BhY2UsIDEpOwogCi0JaWYgKGJrdCAhPSBOVUxMKSB7CSAgICAKKwlpZiAoYmt0ICE9IE5VTEwpIHsKIAkgICAgcmVsYXRpb24tPmJ1Y2tldCA9IGJrdDsKIAkgICAgaWYgKGJrdC0+c2NoZW1hTG9jYXRpb24gPT0gTlVMTCkgewogCQkvKiBGaXJzdCBnaXZlbiBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hOyBsb2FkIHRoZSBkb2MuICovCkBAIC0xMDQyMSwxOSArMTA0MjEsMTkgQEAKIAkJfQogCQlnb3RvIGV4aXQ7CiAJICAgIH0KLQl9CQotCS8qIAorCX0KKwkvKgogCSogTm8gYnVja2V0ICsgZmlyc3QgbG9jYXRpb246IGxvYWQgdGhlIGRvYyBhbmQgY3JlYXRlIGEKIAkqIGJ1Y2tldC4KIAkqLwogICAgIH0gZWxzZSB7CiAJLyogPGluY2x1ZGU+IGFuZCA8cmVkZWZpbmU+ICovCiAJaWYgKGJrdCAhPSBOVUxMKSB7Ci0JICAgIAkgICAgCisKIAkgICAgaWYgKChia3QtPm9yaWdUYXJnZXROYW1lc3BhY2UgPT0gTlVMTCkgJiYKIAkJKGJrdC0+dGFyZ2V0TmFtZXNwYWNlICE9IHNvdXJjZVRhcmdldE5hbWVzcGFjZSkpIHsKIAkJeG1sU2NoZW1hQnVja2V0UHRyIGNoYW1lbDsKLQkJCisKIAkJLyoKIAkJKiBDaGFtZWxlb24gaW5jbHVkZS9yZWRlZmluZTogc2tpcCBsb2FkaW5nIG9ubHkgaWYgaXQgd2FzCiAJCSogYWxlYWR5IGJ1aWxkIGZvciB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBpbmNsdWRpbmcKQEAgLTEwNDU4LDcgKzEwNDU4LDcgQEAKIAkJICAgIHJlbGF0aW9uLT5idWNrZXQgPSBjaGFtZWw7CiAJCSAgICBnb3RvIGV4aXQ7CiAJCX0KLQkJLyogCisJCS8qCiAJCSogV2UgbmVlZCB0byBwYXJzZSB0aGUgY2hhbWVsZW9uIGFnYWluIGZvciBhIGRpZmZlcmVudAogCQkqIHRhcmdldE5hbWVzcGFjZS4KIAkJKiBDSEFNRUxFT04gVE9ETzogT3B0aW1pemUgdGhpcyBieSBvbmx5IHBhcnNpbmcgdGhlCkBAIC0xMDQ2OSw3ICsxMDQ2OSw3IEBACiAJICAgIH0gZWxzZSB7CiAJCXJlbGF0aW9uLT5idWNrZXQgPSBia3Q7CiAJCWdvdG8gZXhpdDsKLQkgICAgfQkgICAgCisJICAgIH0KIAl9CiAgICAgfQogICAgIGlmICgoYmt0ICE9IE5VTEwpICYmIChia3QtPmRvYyAhPSBOVUxMKSkgewpAQCAtMTA1MjEsNyArMTA1MjEsNyBAQAogCQlOVUxMLCBOVUxMLCBTQ0hFTUFTX1BBUlNFX09QVElPTlMpOwogCSAgICBzY2hlbWFMb2NhdGlvbiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiaW5fbWVtb3J5X2J1ZmZlciIpOwogCSAgICBpZiAoZG9jICE9IE5VTEwpCi0JCWRvYy0+VVJMID0gc2NoZW1hTG9jYXRpb247CSAgICAKKwkJZG9jLT5VUkwgPSBzY2hlbWFMb2NhdGlvbjsKIAl9CiAJLyoKIAkqIEZvciA8aW1wb3J0PjoKQEAgLTEwNTc1LDExICsxMDU3NSwxMSBAQAogICAgIGlmIChkb2MgIT0gTlVMTCkgewogCXhtbE5vZGVQdHIgZG9jRWxlbSA9IE5VTEw7CiAKLQlsb2NhdGVkID0gMTsJCisJbG9jYXRlZCA9IDE7CiAJZG9jRWxlbSA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CiAJaWYgKGRvY0VsZW0gPT0gTlVMTCkgewogCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCBwY3R4dCwgWE1MX1NDSEVNQVBfTk9ST09ULAotCQlpbnZva2luZ05vZGUsIE5VTEwsIAorCQlpbnZva2luZ05vZGUsIE5VTEwsCiAJCSJUaGUgZG9jdW1lbnQgJyVzJyBoYXMgbm8gZG9jdW1lbnQgZWxlbWVudCIsCiAJCXNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKIAkgICAgZ290byBleGl0X2Vycm9yOwpAQCAtMTA1OTgsMTQgKzEwNTk4LDE0IEBACiAJCXNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKIAkgICAgZ290byBleGl0X2Vycm9yOwogCX0KLQkvKiAKKwkvKgogCSogTm90ZSB0aGF0IHdlIGRvbid0IGFwcGx5IGEgdHlwZSBjaGVjayBmb3IgdGhlCiAJKiB0YXJnZXROYW1lc3BhY2UgdmFsdWUgaGVyZS4KIAkqLwogCXRhcmdldE5hbWVzcGFjZSA9IHhtbFNjaGVtYUdldFByb3AocGN0eHQsIGRvY0VsZW0sCiAJICAgICJ0YXJnZXROYW1lc3BhY2UiKTsKICAgICB9Ci0gICAgCisKIC8qIGFmdGVyX2RvY19sb2FkaW5nOiAqLwogICAgIGlmICgoYmt0ID09IE5VTEwpICYmIGxvY2F0ZWQpIHsKIAkvKiBPbmx5IGNyZWF0ZSBhIGJ1Y2tldCBpZiB0aGUgc2NoZW1hIHdhcyBsb2NhdGVkLiAqLwpAQCAtMTA2MzIsMTQgKzEwNjMyLDE0IEBACiAJaWYgKHJlbGF0aW9uICE9IE5VTEwpCiAJICAgIHJlbGF0aW9uLT5idWNrZXQgPSBia3Q7CiAgICAgfQotICAKKwogZXhpdDoKICAgICAvKgogICAgICogUmV0dXJuIHRoZSBidWNrZXQgZXhwbGljaXRlbHk7IHRoaXMgaXMgbmVlZGVkIGZvciB0aGUKICAgICAqIG1haW4gc2NoZW1hLgogICAgICovCiAgICAgaWYgKGJ1Y2tldCAhPSBOVUxMKQotCSpidWNrZXQgPSBia3Q7ICAgIAorCSpidWNrZXQgPSBia3Q7CiAgICAgcmV0dXJuICgwKTsKIAogZXhpdF9lcnJvcjoKQEAgLTEwNjU1LDcgKzEwNjU1LDcgQEAKIAl4bWxGcmVlRG9jKGRvYyk7CiAJaWYgKGJrdCAhPSBOVUxMKQogCSAgICBia3QtPmRvYyA9IE5VTEw7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgcmV0dXJuICgtMSk7CiB9CiAKQEAgLTEwNzU1LDggKzEwNzU1LDggQEAKICAgICB0aGlzVGFyZ2V0TmFtZXNwYWNlID0gV1hTX0JVQ0tFVChwY3R4dCktPm9yaWdUYXJnZXROYW1lc3BhY2U7CiAgICAgaWYgKG5hbWVzcGFjZU5hbWUgIT0gTlVMTCkgewogCS8qCi0JKiAxLjEgSWYgdGhlIG5hbWVzcGFjZSBbYXR0cmlidXRlXSBpcyBwcmVzZW50LCB0aGVuIGl0cyC3YWN0dWFsIHZhbHVltwotCSogbXVzdCBub3QgbWF0Y2ggdGhlILdhY3R1YWwgdmFsdWW3IG9mIHRoZSBlbmNsb3NpbmcgPHNjaGVtYT4ncworCSogMS4xIElmIHRoZSBuYW1lc3BhY2UgW2F0dHJpYnV0ZV0gaXMgcHJlc2VudCwgdGhlbiBpdHMg77+9YWN0dWFsIHZhbHVl77+9CisJKiBtdXN0IG5vdCBtYXRjaCB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIHRoZSBlbmNsb3NpbmcgPHNjaGVtYT4ncwogCSogdGFyZ2V0TmFtZXNwYWNlIFthdHRyaWJ1dGVdLgogCSovCiAJaWYgKHhtbFN0ckVxdWFsKHRoaXNUYXJnZXROYW1lc3BhY2UsIG5hbWVzcGFjZU5hbWUpKSB7CkBAIC0xMDgxMCwxMSArMTA4MTAsMTEgQEAKIAkgICAgIkZhaWxlZCB0byBsb2NhdGUgYSBzY2hlbWEgYXQgbG9jYXRpb24gJyVzJy4gIgogCSAgICAiU2tpcHBpbmcgdGhlIGltcG9ydCIsIHNjaGVtYUxvY2F0aW9uLCBOVUxMLCBOVUxMKTsKICAgICB9Ci0gICAgCi0gICAgaWYgKChidWNrZXQgIT0gTlVMTCkgJiYgQ0FOX1BBUlNFX1NDSEVNQShidWNrZXQpKSB7CQorCisgICAgaWYgKChidWNrZXQgIT0gTlVMTCkgJiYgQ0FOX1BBUlNFX1NDSEVNQShidWNrZXQpKSB7CiAJcmV0ID0geG1sU2NoZW1hUGFyc2VOZXdEb2MocGN0eHQsIHNjaGVtYSwgYnVja2V0KTsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTEwODk2LDcgKzEwODk2LDcgQEAKIAkJWE1MX1NDSEVNQVBfU1JDX1JFREVGSU5FLAogCQlOVUxMLCBub2RlLAogCQkiVGhlIHNjaGVtYSBkb2N1bWVudCAnJXMnIGNhbm5vdCByZWRlZmluZSBpdHNlbGYuIiwKLQkJKnNjaGVtYUxvY2F0aW9uKTsJICAgIAorCQkqc2NoZW1hTG9jYXRpb24pOwogCX0gZWxzZSB7CiAJICAgIHhtbFNjaGVtYVBDdXN0b21FcnIocGN0eHQsCiAJCVhNTF9TQ0hFTUFQX1NSQ19JTkNMVURFLApAQCAtMTA5MDYsNyArMTA5MDYsNyBAQAogCX0KIAlnb3RvIGV4aXRfZXJyb3I7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuKDApOwogZXhpdF9lcnJvcjoKICAgICByZXR1cm4ocGN0eHQtPmVycik7CkBAIC0xMDkzNiwxOSArMTA5MzYsMTkgQEAKICAgICByZXMgPSB4bWxTY2hlbWFQYXJzZUluY2x1ZGVPclJlZGVmaW5lQXR0cnMocGN0eHQsIHNjaGVtYSwKIAlub2RlLCAoeG1sQ2hhciAqKikgKCZzY2hlbWFMb2NhdGlvbiksIHR5cGUpOwogICAgIGlmIChyZXMgIT0gMCkKLQlyZXR1cm4ocmVzKTsgICAgCSAgIAorCXJldHVybihyZXMpOwogICAgIC8qCiAgICAgKiBMb2FkIGFuZCBhZGQgdGhlIHNjaGVtYSBkb2N1bWVudC4KICAgICAqLwogICAgIHJlcyA9IHhtbFNjaGVtYUFkZFNjaGVtYURvYyhwY3R4dCwgdHlwZSwgc2NoZW1hTG9jYXRpb24sIE5VTEwsCiAJTlVMTCwgMCwgbm9kZSwgcGN0eHQtPnRhcmdldE5hbWVzcGFjZSwgTlVMTCwgJmJ1Y2tldCk7CiAgICAgaWYgKHJlcyAhPSAwKQotCXJldHVybihyZXMpOyAgICAKKwlyZXR1cm4ocmVzKTsKICAgICAvKgogICAgICogSWYgd2UgZ2V0IG5vIHNjaGVtYSBidWNrZXQgYmFjaywgdGhlbiB0aGlzIG1lYW5zIHRoYXQgdGhlIHNjaGVtYQogICAgICogZG9jdW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQgb3Igd2FzIGJyb2tlbiBYTUwgb3Igd2FzIG5vdAogICAgICogYSBzY2hlbWEgZG9jdW1lbnQuCi0gICAgKi8gICAgCisgICAgKi8KICAgICBpZiAoKGJ1Y2tldCA9PSBOVUxMKSB8fCAoYnVja2V0LT5kb2MgPT0gTlVMTCkpIHsKIAlpZiAodHlwZSA9PSBYTUxfU0NIRU1BX1NDSEVNQV9JTkNMVURFKSB7CiAJICAgIC8qCkBAIC0xMDk1Nyw3ICsxMDk1Nyw3IEBACiAJICAgICogZm9yIGluY2x1c2lvbnMsIHNpbmNlIHRoZSB0aGF0IHdhcyB0aGUgZmVlZGJhY2sgZnJvbSB0aGUKIAkgICAgKiBzY2hlbWEgcGVvcGxlLiBJLmUuIHRoZSBmb2xsb3dpbmcgc3BlYyBwaWVjZSB3aWxsICpub3QqIGJlCiAJICAgICogc2F0aXNmaWVkOgotCSAgICAqIFNQRUMgc3JjLWluY2x1ZGU6ICJJdCBpcyBub3QgYW4gZXJyb3IgZm9yIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUKKwkgICAgKiBTUEVDIHNyYy1pbmNsdWRlOiAiSXQgaXMgbm90IGFuIGVycm9yIGZvciB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIHRoZQogCSAgICAqIHNjaGVtYUxvY2F0aW9uIFthdHRyaWJ1dGVdIHRvIGZhaWwgdG8gcmVzb2x2ZSBpdCBhbGwsIGluIHdoaWNoCiAJICAgICogY2FzZSBubyBjb3JyZXNwb25kaW5nIGluY2x1c2lvbiBpcyBwZXJmb3JtZWQuCiAJICAgICogU28gZG8gd2UgbmVlZCBhIHdhcm5pbmcgcmVwb3J0IGhlcmU/IgpAQCAtMTA5NzQsNyArMTA5NzQsNyBAQAogCSAgICAqCiAJICAgICogU1BFQyBzcmMtcmVkZWZpbmUgKDEpCiAJICAgICogIklmIHRoZXJlIGFyZSBhbnkgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtcyBhbW9uZyB0aGUgW2NoaWxkcmVuXQotCSAgICAqIG90aGVyIHRoYW4gPGFubm90YXRpb24+IHRoZW4gdGhlILdhY3R1YWwgdmFsdWW3IG9mIHRoZQorCSAgICAqIG90aGVyIHRoYW4gPGFubm90YXRpb24+IHRoZW4gdGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiB0aGUKIAkgICAgKiBzY2hlbWFMb2NhdGlvbiBbYXR0cmlidXRlXSBtdXN0IHN1Y2Nlc3NmdWxseSByZXNvbHZlLiIKIAkgICAgKiBUT0RPOiBBc2sgdGhlIFdHIGlmIGEgdGhlIGxvY2F0aW9uIGhhcyBhbHdheXMgdG8gcmVzb2x2ZQogCSAgICAqIGhlcmUgYXMgd2VsbCEKQEAgLTEwOTkwLDEzICsxMDk5MCwxMyBAQAogCSogQ2hlY2sgdGFyZ2V0TmFtZXNwYWNlIHNhbml0eSBiZWZvcmUgcGFyc2luZyB0aGUgbmV3IHNjaGVtYS4KIAkqIFRPRE86IE5vdGUgdGhhdCB3ZSB3b24ndCBjaGVjayBmdXJ0aGVyIGNvbnRlbnQgaWYgdGhlCiAJKiB0YXJnZXROYW1lc3BhY2Ugd2FzIGJhZC4KLQkqLyAgICAKLQlpZiAoYnVja2V0LT5vcmlnVGFyZ2V0TmFtZXNwYWNlICE9IE5VTEwpIHsJICAgIAorCSovCisJaWYgKGJ1Y2tldC0+b3JpZ1RhcmdldE5hbWVzcGFjZSAhPSBOVUxMKSB7CiAJICAgIC8qCiAJICAgICogU1BFQyBzcmMtaW5jbHVkZSAoMi4xKQotCSAgICAqICJTSUkgaGFzIGEgdGFyZ2V0TmFtZXNwYWNlIFthdHRyaWJ1dGVdLCBhbmQgaXRzILdhY3R1YWwKLQkgICAgKiB2YWx1ZbcgaXMgaWRlbnRpY2FsIHRvIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgdGFyZ2V0TmFtZXNwYWNlCi0JICAgICogW2F0dHJpYnV0ZV0gb2YgU0lJkiAod2hpY2ggbXVzdCBoYXZlIHN1Y2ggYW4gW2F0dHJpYnV0ZV0pLiIKKwkgICAgKiAiU0lJIGhhcyBhIHRhcmdldE5hbWVzcGFjZSBbYXR0cmlidXRlXSwgYW5kIGl0cyDvv71hY3R1YWwKKwkgICAgKiB2YWx1Ze+/vSBpcyBpZGVudGljYWwgdG8gdGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiB0aGUgdGFyZ2V0TmFtZXNwYWNlCisJICAgICogW2F0dHJpYnV0ZV0gb2YgU0lJ77+9ICh3aGljaCBtdXN0IGhhdmUgc3VjaCBhbiBbYXR0cmlidXRlXSkuIgogCSAgICAqLwogCSAgICBpZiAocGN0eHQtPnRhcmdldE5hbWVzcGFjZSA9PSBOVUxMKSB7CiAJCXhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIHBjdHh0LApAQCAtMTEwMjAsNyArMTEwMjAsNyBAQAogCQkgICAgcGN0eHQtPnRhcmdldE5hbWVzcGFjZSk7CiAJCWdvdG8gZXhpdF9lcnJvcjsKIAkgICAgfQotCX0gZWxzZSBpZiAocGN0eHQtPnRhcmdldE5hbWVzcGFjZSAhPSBOVUxMKSB7CSAgICAKKwl9IGVsc2UgaWYgKHBjdHh0LT50YXJnZXROYW1lc3BhY2UgIT0gTlVMTCkgewogCSAgICAvKgogCSAgICAqIENoYW1lbGVvbnM6IHRoZSBvcmlnaW5hbCB0YXJnZXQgbmFtZXNwYWNlIHdpbGwKIAkgICAgKiBkaWZmZXIgZnJvbSB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZS4KQEAgLTExMDM4LDEwICsxMTAzOCwxMCBAQAogCSAgICB9CiAJICAgIGJ1Y2tldC0+dGFyZ2V0TmFtZXNwYWNlID0gcGN0eHQtPnRhcmdldE5hbWVzcGFjZTsKIAl9Ci0gICAgfSAgICAKKyAgICB9CiAgICAgLyoKICAgICAqIFBhcnNlIHRoZSBzY2hlbWEuCi0gICAgKi8gICAKKyAgICAqLwogICAgIGlmIChidWNrZXQgJiYgKCFidWNrZXQtPnBhcnNlZCkgJiYgKGJ1Y2tldC0+ZG9jICE9IE5VTEwpKSB7CiAJaWYgKGlzQ2hhbWVsZW9uKSB7CiAJICAgIC8qIFRPRE86IEdldCByaWQgb2YgdGhpcyBmbGFnIG9uIHRoZSBzY2hlbWEgaXRzZWxmLiAqLwpAQCAtMTEwNTgsOCArMTEwNTgsOCBAQAogICAgIC8qCiAgICAgKiBBbmQgbm93IGZvciB0aGUgY2hpbGRyZW4uLi4KICAgICAqLwotICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47ICAgIAotICAgIGlmICh0eXBlID09IFhNTF9TQ0hFTUFfU0NIRU1BX1JFREVGSU5FKSB7CQorICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CisgICAgaWYgKHR5cGUgPT0gWE1MX1NDSEVNQV9TQ0hFTUFfUkVERUZJTkUpIHsKIAkvKgogCSogUGFyc2UgKHNpbXBsZVR5cGUgfCBjb21wbGV4VHlwZSB8IGdyb3VwIHwgYXR0cmlidXRlR3JvdXApKSoKIAkqLwpAQCAtMTEwODIsNyArMTEwODIsNyBAQAogCSAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImNvbXBsZXhUeXBlIikpIHsKIAkJeG1sU2NoZW1hUGFyc2VDb21wbGV4VHlwZShwY3R4dCwgc2NoZW1hLCBjaGlsZCwgMSk7CiAJCS8qIGhhc1JlZGVmaW5pdGlvbnMgPSAxOyAqLwotCSAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImdyb3VwIikpIHsJCQorCSAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImdyb3VwIikpIHsKIAkJLyogaGFzUmVkZWZpbml0aW9ucyA9IDE7ICovCiAJCXhtbFNjaGVtYVBhcnNlTW9kZWxHcm91cERlZmluaXRpb24ocGN0eHQsCiAJCSAgICBzY2hlbWEsIGNoaWxkKTsKQEAgLTExMTAyLDcgKzExMTAyLDcgQEAKIAkgICAgKi8KIAkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKIAl9Ci0gICAgfSAgICAKKyAgICB9CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKIAlyZXMgPSBYTUxfU0NIRU1BUF9TNFNfRUxFTV9OT1RfQUxMT1dFRDsKIAlpZiAodHlwZSA9PSBYTUxfU0NIRU1BX1NDSEVNQV9SRURFRklORSkgewpAQCAtMTExMTMsOCArMTExMTMsOCBAQAogCSAgICAgeG1sU2NoZW1hUENvbnRlbnRFcnIocGN0eHQsIHJlcywKIAkJTlVMTCwgbm9kZSwgY2hpbGQsIE5VTEwsCiAJCSIoYW5ub3RhdGlvbj8pIik7Ci0JfQkKLSAgICB9ICAgICAgIAorCX0KKyAgICB9CiAgICAgcmV0dXJuKHJlcyk7CiAKIGV4aXRfZXJyb3I6CkBAIC0xMTE2NCw3ICsxMTE2NCw3IEBACiAgKiAgICAgUmVkZWZpbml0aW9uIENvbnN0cmFpbnRzIGFuZCBTZW1hbnRpY3MgKHNyYy1yZWRlZmluZSkKICAqICAgICAoNi4xKSwgKDYuMS4xKSwgKDYuMS4yKQogICoKLSAqICAgU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiAKKyAqICAgU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OgogICogICAgIEFsbCBHcm91cCBMaW1pdGVkIChjb3MtYWxsLWxpbWl0ZWQpICgyKQogICogICAgIFRPRE86IEFjdHVhbGx5IHRoaXMgc2hvdWxkIGdvIHRvIGNvbXBvbmVudC1sZXZlbCBjaGVja3MsCiAgKiAgICAgYnV0IGlzIGRvbmUgaGVyZSBkdWUgdG8gcGVyZm9ybWFuY2UuIE1vdmUgaXQgdG8gYW4gb3RoZXIgbGF5ZXIKQEAgLTExMzQzLDggKzExMzQzLDggQEAKIAkJCS8qCiAJCQkqIFNQRUMgc3JjLXJlZGVmaW5lOgogCQkJKiAoNi4xKSAiSWYgaXQgaGFzIGEgPGdyb3VwPiBhbW9uZyBpdHMgY29udGVudHMgYXQKLQkJCSogc29tZSBsZXZlbCB0aGUgt2FjdHVhbCB2YWx1Zbcgb2Ygd2hvc2UgcmVmCi0JCQkqIFthdHRyaWJ1dGVdIGlzIHRoZSBzYW1lIGFzIHRoZSC3YWN0dWFsIHZhbHVltyBvZgorCQkJKiBzb21lIGxldmVsIHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2Ygd2hvc2UgcmVmCisJCQkqIFthdHRyaWJ1dGVdIGlzIHRoZSBzYW1lIGFzIHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2YKIAkJCSogaXRzIG93biBuYW1lIGF0dHJpYnV0ZSBwbHVzIHRhcmdldCBuYW1lc3BhY2UsIHRoZW4KIAkJCSogYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiIKIAkJCSogKDYuMS4xKSAiSXQgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHN1Y2ggZ3JvdXAuIgpAQCAtMTEzNjksOSArMTEzNjksOSBAQAogCQkJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CiAJCQkgICAgLyoKIAkJCSAgICAqIFNQRUMgc3JjLXJlZGVmaW5lOgotCQkJICAgICogKDYuMS4yKSAiVGhlILdhY3R1YWwgdmFsdWW3IG9mIGJvdGggdGhhdAorCQkJICAgICogKDYuMS4yKSAiVGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiBib3RoIHRoYXQKIAkJCSAgICAqIGdyb3VwJ3MgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgW2F0dHJpYnV0ZV0KLQkJCSAgICAqIG11c3QgYmUgMSAob3Igt2Fic2VudLcpLgorCQkJICAgICogbXVzdCBiZSAxIChvciDvv71hYnNlbnTvv70pLgogCQkJICAgICovCiAJCQkgICAgeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgY3R4dCwKIAkJCQlYTUxfU0NIRU1BUF9TUkNfUkVERUZJTkUsIGNoaWxkLCBOVUxMLApAQCAtMTEzODgsNyArMTEzODgsNyBAQAogCQkJfQogCQkJY3R4dC0+cmVkZWYtPnJlZmVyZW5jZSA9IFdYU19CQVNJQ19DQVNUIHBhcnQ7CiAJCQljdHh0LT5yZWRlZkNvdW50ZXIrKzsKLQkJICAgIH0JCSAgICAgICAgCQkgICAKKwkJICAgIH0KIAkJfQogCSAgICB9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImFueSIpKSB7CiAJCXBhcnQgPSAoeG1sU2NoZW1hVHJlZUl0ZW1QdHIpCkBAIC0xMTQyNSw3ICsxMTQyNSw3IEBACiAJV1hTX0FERF9QRU5ESU5HKGN0eHQsIGl0ZW0pOwogICAgIH0KICAgICBpZiAod2l0aFBhcnRpY2xlKQotCXJldHVybiAoKHhtbFNjaGVtYVRyZWVJdGVtUHRyKSBwYXJ0aWNsZSk7CQorCXJldHVybiAoKHhtbFNjaGVtYVRyZWVJdGVtUHRyKSBwYXJ0aWNsZSk7CiAgICAgZWxzZQogCXJldHVybiAoKHhtbFNjaGVtYVRyZWVJdGVtUHRyKSBpdGVtKTsKIH0KQEAgLTExNDc3LDcgKzExNDc3LDcgQEAKICAgICAqLwogICAgIHhtbFNjaGVtYVBWYWxBdHRySUQoY3R4dCwgbm9kZSwgQkFEX0NBU1QgImlkIik7CiAgICAgLyoKLSAgICAqIEF0dHJpYnV0ZSAKKyAgICAqIEF0dHJpYnV0ZQogICAgICovCiAgICAgLyoKICAgICAqIEV4dHJhY3QgdGhlIGJhc2UgdHlwZS4gVGhlICJiYXNlIiBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIGluc2lkZQpAQCAtMTE0ODUsOCArMTE0ODUsOCBAQAogICAgICoKICAgICAqIFNQRUMgKDEuMikgIi4uLm90aGVyd2lzZSAoPHJlc3RyaWN0aW9uPiBoYXMgbm8gPHNpbXBsZVR5cGU+ICIKICAgICAqIGFtb25nIGl0cyBbY2hpbGRyZW5dKSwgdGhlIHNpbXBsZSB0eXBlIGRlZmluaXRpb24gd2hpY2ggaXMKLSAgICAqIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgdHlwZSBkZWZpbml0aW9uILdyZXNvbHZlZLcgdG8gYnkKLSAgICAqIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXSIKKyAgICAqIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgdHlwZSBkZWZpbml0aW9uIO+/vXJlc29sdmVk77+9IHRvIGJ5CisgICAgKiB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIHRoZSBiYXNlIFthdHRyaWJ1dGVdIgogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYVBWYWxBdHRyUU5hbWUoY3R4dCwgc2NoZW1hLCBOVUxMLCBub2RlLCAiYmFzZSIsCiAJJih0eXBlLT5iYXNlTnMpLCAmKHR5cGUtPmJhc2UpKSA9PSAwKQpAQCAtMTE1MDksOCArMTE1MDksOCBAQAogCQkvKgogCQkqIFJFREVGSU5FOiBTUEVDIHNyYy1yZWRlZmluZSAoNSkKIAkJKiAiV2l0aGluIHRoZSBbY2hpbGRyZW5dLCBlYWNoIDxzaW1wbGVUeXBlPiBtdXN0IGhhdmUgYQotCQkqIDxyZXN0cmljdGlvbj4gYW1vbmcgaXRzIFtjaGlsZHJlbl0gLi4uIHRoZSC3YWN0dWFsIHZhbHVltyBvZgotCQkqIHdob3NlIGJhc2UgW2F0dHJpYnV0ZV0gbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgt2FjdHVhbCB2YWx1ZbcKKwkJKiA8cmVzdHJpY3Rpb24+IGFtb25nIGl0cyBbY2hpbGRyZW5dIC4uLiB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mCisJCSogd2hvc2UgYmFzZSBbYXR0cmlidXRlXSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSDvv71hY3R1YWwgdmFsdWXvv70KIAkJKiBvZiBpdHMgb3duIG5hbWUgYXR0cmlidXRlIHBsdXMgdGFyZ2V0IG5hbWVzcGFjZTsiCiAJCSovCiAJCXhtbFNjaGVtYVBDdXN0b21FcnJFeHQoY3R4dCwgWE1MX1NDSEVNQVBfU1JDX1JFREVGSU5FLApAQCAtMTE1MjYsNyArMTE1MjYsNyBAQAogCQl0eXBlLT5iYXNlID0gTlVMTDsKIAkJdHlwZS0+YmFzZU5zID0gTlVMTDsKIAkgICAgfQotCX0JCQorCX0KICAgICB9CiAgICAgLyoKICAgICAqIEFuZCBub3cgZm9yIHRoZSBjaGlsZHJlbi4uLgpAQCAtMTE1OTMsNyArMTE1OTMsNyBAQAogCS8qCiAJKiBNb2RlbCBncm91cCByZWZlcmVuY2UgPGdyb3VwPi4KIAkqLwotCX0gZWxzZSBpZiAoSVNfU0NIRU1BKGNoaWxkLCAiZ3JvdXAiKSkgewkgICAgCisJfSBlbHNlIGlmIChJU19TQ0hFTUEoY2hpbGQsICJncm91cCIpKSB7CiAJICAgIHR5cGUtPnN1YnR5cGVzID0gKHhtbFNjaGVtYVR5cGVQdHIpCiAJCXhtbFNjaGVtYVBhcnNlTW9kZWxHcm91cERlZlJlZihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKIAkgICAgLyoKQEAgLTExOTMxLDEzICsxMTkzMSwxMyBAQAogCXhtbFNjaGVtYVBDb250ZW50RXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1M0U19FTEVNX01JU1NJTkcsCiAJICAgIE5VTEwsIG5vZGUsIE5VTEwsIE5VTEwsCi0JICAgICIoYW5ub3RhdGlvbj8sIChyZXN0cmljdGlvbiB8IGV4dGVuc2lvbikpIik7CQorCSAgICAiKGFubm90YXRpb24/LCAocmVzdHJpY3Rpb24gfCBleHRlbnNpb24pKSIpOwogICAgIH0KICAgICBpZiAoY2hpbGQgPT0gTlVMTCkgewogCXhtbFNjaGVtYVBDb250ZW50RXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1M0U19FTEVNX01JU1NJTkcsCiAJICAgIE5VTEwsIG5vZGUsIE5VTEwsIE5VTEwsCi0JICAgICIoYW5ub3RhdGlvbj8sIChyZXN0cmljdGlvbiB8IGV4dGVuc2lvbikpIik7CQorCSAgICAiKGFubm90YXRpb24/LCAocmVzdHJpY3Rpb24gfCBleHRlbnNpb24pKSIpOwogICAgIH0KICAgICBpZiAoSVNfU0NIRU1BKGNoaWxkLCAicmVzdHJpY3Rpb24iKSkgewogICAgICAgICB4bWxTY2hlbWFQYXJzZVJlc3RyaWN0aW9uKGN0eHQsIHNjaGVtYSwgY2hpbGQsCkBAIC0xMjA5NCw3ICsxMjA5NCw3IEBACiAJfSBlbHNlIGlmICh4bWxTY2hlbWFQVmFsQXR0ck5vZGUoY3R4dCwgTlVMTCwgYXR0ciwKIAkgICAgeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfTkNOQU1FKSwgJm5hbWUpICE9IDApIHsKIAkgICAgcmV0dXJuIChOVUxMKTsKLQl9CQorCX0KICAgICB9CiAKICAgICBpZiAodG9wTGV2ZWwgPT0gMCkgewpAQCAtMTIxODMsNyArMTIxODMsNyBAQAogCQkJICAgIE5VTEwsICh4bWxOb2RlUHRyKSBhdHRyLCBOVUxMLAogCQkJICAgICIoI2FsbCB8IExpc3Qgb2YgKGV4dGVuc2lvbiB8IHJlc3RyaWN0aW9uKSkiLAogCQkJICAgIGF0dHJWYWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JCSAgICB9IGVsc2UgCisJCSAgICB9IGVsc2UKIAkJCWZpbmFsID0gMTsKIAkJfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiYmxvY2siKSkgewogCQkgICAgLyoKQEAgLTEyMjAxLDcgKzEyMjAxLDcgQEAKIAkJCSAgICBOVUxMLCAoeG1sTm9kZVB0cikgYXR0ciwgTlVMTCwKIAkJCSAgICAiKCNhbGwgfCBMaXN0IG9mIChleHRlbnNpb24gfCByZXN0cmljdGlvbikpICIsCiAJCQkgICAgYXR0clZhbHVlLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQkJICAgIH0gZWxzZSAKKwkJICAgIH0gZWxzZQogCQkJYmxvY2sgPSAxOwogCQl9IGVsc2UgewogCQkJeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsCkBAIC0xMjIxMiw3ICsxMjIxMiw3IEBACiAJCSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgTlVMTCwgYXR0cik7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGF0dHItPm5zLT5ocmVmLCB4bWxTY2hlbWFOcykpIHsKLQkgICAgeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsIAorCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwKIAkJWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIE5VTEwsIGF0dHIpOwogCX0KIAlhdHRyID0gYXR0ci0+bmV4dDsKQEAgLTEyMjcxLDcgKzEyMjcxLDcgQEAKIAkqIFNQRUMKIAkqICIuLi50aGUgdGhpcmQgYWx0ZXJuYXRpdmUgKG5laXRoZXIgPHNpbXBsZUNvbnRlbnQ+IG5vcgogCSogPGNvbXBsZXhDb250ZW50PikgaXMgY2hvc2VuLiBUaGlzIGNhc2UgaXMgdW5kZXJzdG9vZCBhcyBzaG9ydGhhbmQKLQkqIGZvciBjb21wbGV4IGNvbnRlbnQgcmVzdHJpY3RpbmcgdGhlILd1ci10eXBlIGRlZmluaXRpb263LCBhbmQgdGhlCisJKiBmb3IgY29tcGxleCBjb250ZW50IHJlc3RyaWN0aW5nIHRoZSDvv711ci10eXBlIGRlZmluaXRpb27vv70sIGFuZCB0aGUKIAkqIGRldGFpbHMgb2YgdGhlIG1hcHBpbmdzIHNob3VsZCBiZSBtb2RpZmllZCBhcyBuZWNlc3NhcnkuCiAJKi8KIAl0eXBlLT5iYXNlVHlwZSA9IHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVRZUEUpOwpAQCAtMTI0NDgsNyArMTI0NDgsNyBAQAogCXJldHVybihOVUxMKTsKICAgICByZXQtPmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICByZXQtPnNpemUgPSBzaXplOwotICAgIHJldC0+ZGljdCA9IHhtbERpY3RDcmVhdGUoKTsgICAgCisgICAgcmV0LT5kaWN0ID0geG1sRGljdENyZWF0ZSgpOwogICAgIHJldHVybiAocmV0KTsKIH0KIApAQCAtMTI0OTEsNyArMTI0OTEsNyBAQAogICAgIGlmIChjdHh0ID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKICAgICBpZiAoY3R4dC0+ZG9jICE9IE5VTEwgJiYgIWN0eHQtPnByZXNlcnZlKQotICAgICAgICB4bWxGcmVlRG9jKGN0eHQtPmRvYyk7ICAgIAorICAgICAgICB4bWxGcmVlRG9jKGN0eHQtPmRvYyk7CiAgICAgaWYgKGN0eHQtPnZjdHh0ICE9IE5VTEwpIHsKIAl4bWxTY2hlbWFGcmVlVmFsaWRDdHh0KGN0eHQtPnZjdHh0KTsKICAgICB9CkBAIC0xMjU3Myw3ICsxMjU3Myw3IEBACiAJICAgICogIHdhcyBpbmNvcnJlY3RseSB1c2VkIGluc3RlYWQgb2YgeG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMigpCiAJICAgICogIChzZWVtcyBsaWtlIGEgY29weSZwYXN0ZSBidWcgZnJvbSB0aGUgWE1MX1NDSEVNQV9UWVBFX0FMTAogCSAgICAqICBzZWN0aW9uIGluIHhtbFNjaGVtYUJ1aWxkQUNvbnRlbnRNb2RlbCgpICkuCi0JICAgICogVE9ETzogQ2hlY2sgaWYgeG1sQXV0b21hdGFOZXdPbmNlVHJhbnMyKCkgd2FzIGluc3RlYWQgCisJICAgICogVE9ETzogQ2hlY2sgaWYgeG1sQXV0b21hdGFOZXdPbmNlVHJhbnMyKCkgd2FzIGluc3RlYWQKIAkgICAgKiAgaW50ZW5kZWQgZm9yIHRoZSBhYm92ZSAiY291bnRlciIgc2VjdGlvbiBvcmlnaW5hbGx5LiBJLmUuLAogCSAgICAqICBjaGVjayB4czphbGwgd2l0aCBzdWJzdC1ncm91cHMuCiAJICAgICoKQEAgLTEyNTgyLDcgKzEyNTgyLDcgQEAKIAkgICAgKgkJICAgICAgIDEsIDEsIG1lbWJlcik7CiAJICAgICovCiAJICAgIHRtcCA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIocGN0eHQtPmFtLCBzdGFydCwgTlVMTCwKLQkJbWVtYmVyLT5uYW1lLCBtZW1iZXItPnRhcmdldE5hbWVzcGFjZSwgbWVtYmVyKTsJICAgIAorCQltZW1iZXItPm5hbWUsIG1lbWJlci0+dGFyZ2V0TmFtZXNwYWNlLCBtZW1iZXIpOwogCSAgICB4bWxBdXRvbWF0YU5ld0Vwc2lsb24ocGN0eHQtPmFtLCB0bXAsIGVuZCk7CiAJfQogICAgIH0gZWxzZSB7CkBAIC0xMjY0NSwxMSArMTI2NDUsMTEgQEAKIAl9IGVsc2UgaWYgKChwYXJ0aWNsZS0+bWF4T2NjdXJzID49IFVOQk9VTkRFRCkgJiYKIAkgICAgICAgICAgIChwYXJ0aWNsZS0+bWluT2NjdXJzIDwgMikpIHsKIAkgICAgLyogU3BlY2lhbCBjYXNlLiAqLwotCSAgICBzdGFydCA9IGN0eHQtPnN0YXRlOwkgICAgCisJICAgIHN0YXJ0ID0gY3R4dC0+c3RhdGU7CiAJICAgIGN0eHQtPnN0YXRlID0geG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwgc3RhcnQsIE5VTEwsCi0JCWVsZW1EZWNsLT5uYW1lLCBlbGVtRGVjbC0+dGFyZ2V0TmFtZXNwYWNlLCBlbGVtRGVjbCk7CSAgICAKKwkJZWxlbURlY2wtPm5hbWUsIGVsZW1EZWNsLT50YXJnZXROYW1lc3BhY2UsIGVsZW1EZWNsKTsKIAkgICAgY3R4dC0+c3RhdGUgPSB4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24yKGN0eHQtPmFtLCBjdHh0LT5zdGF0ZSwgY3R4dC0+c3RhdGUsCi0JCWVsZW1EZWNsLT5uYW1lLCBlbGVtRGVjbC0+dGFyZ2V0TmFtZXNwYWNlLCBlbGVtRGVjbCk7CSAgICAKKwkJZWxlbURlY2wtPm5hbWUsIGVsZW1EZWNsLT50YXJnZXROYW1lc3BhY2UsIGVsZW1EZWNsKTsKIAl9IGVsc2UgewogCSAgICBpbnQgY291bnRlcjsKIAkgICAgaW50IG1heE9jY3VycyA9IHBhcnRpY2xlLT5tYXhPY2N1cnMgPT0gVU5CT1VOREVEID8KQEAgLTEyNjg0LDcgKzEyNjg0LDcgQEAKIAkJCSAgICB4bWxTY2hlbWFQYXJ0aWNsZVB0ciBwYXJ0aWNsZSkKIHsKICAgICBpZiAocGFydGljbGUgPT0gTlVMTCkgewotCVBFUlJPUl9JTlQoInhtbFNjaGVtYUJ1aWxkQUNvbnRlbnRNb2RlbCIsICJwYXJ0aWNsZSBpcyBOVUxMIik7CSAgICAKKwlQRVJST1JfSU5UKCJ4bWxTY2hlbWFCdWlsZEFDb250ZW50TW9kZWwiLCAicGFydGljbGUgaXMgTlVMTCIpOwogCXJldHVybjsKICAgICB9CiAgICAgaWYgKHBhcnRpY2xlLT5jaGlsZHJlbiA9PSBOVUxMKSB7CkBAIC0xMzExNSw4ICsxMzExNSw4IEBACiAgICAgaWYgKChlbGVtRGVjbC0+c3VidHlwZXMgPT0gTlVMTCkgJiYgKGVsZW1EZWNsLT5uYW1lZFR5cGUgIT0gTlVMTCkpIHsKIAl4bWxTY2hlbWFUeXBlUHRyIHR5cGU7CiAKLQkvKiAodHlwZSBkZWZpbml0aW9uKSAuLi4gb3RoZXJ3aXNlIHRoZSB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktwotCSogdG8gYnkgdGhlILdhY3R1YWwgdmFsdWW3IG9mIHRoZSB0eXBlIFthdHRyaWJ1dGVdIC4uLgorCS8qICh0eXBlIGRlZmluaXRpb24pIC4uLiBvdGhlcndpc2UgdGhlIHR5cGUgZGVmaW5pdGlvbiDvv71yZXNvbHZlZO+/vQorCSogdG8gYnkgdGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiB0aGUgdHlwZSBbYXR0cmlidXRlXSAuLi4KIAkqLwogCXR5cGUgPSB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgZWxlbURlY2wtPm5hbWVkVHlwZSwKIAkgICAgZWxlbURlY2wtPm5hbWVkVHlwZU5zKTsKQEAgLTEzMTU0LDcgKzEzMTU0LDcgQEAKIAkgICAgLyoKIAkgICAgKiBUaGUgdHlwZSBkZWZpbml0aW9ucyBpcyBzZXQgdG86CiAJICAgICogU1BFQyAiLi4udGhlIHt0eXBlIGRlZmluaXRpb259IG9mIHRoZSBlbGVtZW50Ci0JICAgICogZGVjbGFyYXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1ZbcKKwkgICAgKiBkZWNsYXJhdGlvbiDvv71yZXNvbHZlZO+/vSB0byBieSB0aGUg77+9YWN0dWFsIHZhbHVl77+9CiAJICAgICogb2YgdGhlIHN1YnN0aXR1dGlvbkdyb3VwIFthdHRyaWJ1dGVdLCBpZiBwcmVzZW50IgogCSAgICAqLwogCSAgICBpZiAoZWxlbURlY2wtPnN1YnR5cGVzID09IE5VTEwpCkBAIC0xMzE5Miw4ICsxMzE5Miw4IEBACiAKICAgICAvKgogICAgICogU1BFQyAoMSkgIklmIHRoZSA8dW5pb24+IGFsdGVybmF0aXZlIGlzIGNob3NlbiwgdGhlbiBbRGVmaW5pdGlvbjpdCi0gICAgKiBkZWZpbmUgdGhlIGV4cGxpY2l0IG1lbWJlcnMgYXMgdGhlIHR5cGUgZGVmaW5pdGlvbnMgt3Jlc29sdmVktwotICAgICogdG8gYnkgdGhlIGl0ZW1zIGluIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgbWVtYmVyVHlwZXMgW2F0dHJpYnV0ZV0sCisgICAgKiBkZWZpbmUgdGhlIGV4cGxpY2l0IG1lbWJlcnMgYXMgdGhlIHR5cGUgZGVmaW5pdGlvbnMg77+9cmVzb2x2ZWTvv70KKyAgICAqIHRvIGJ5IHRoZSBpdGVtcyBpbiB0aGUg77+9YWN0dWFsIHZhbHVl77+9IG9mIHRoZSBtZW1iZXJUeXBlcyBbYXR0cmlidXRlXSwKICAgICAqIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIHR5cGUgZGVmaW5pdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUKICAgICAqIDxzaW1wbGVUeXBlPnMgYW1vbmcgdGhlIFtjaGlsZHJlbl0gb2YgPHVuaW9uPiwgaWYgYW55LiIKICAgICAqLwpAQCAtMTMzMDYsNyArMTMzMDYsNiBAQAogCiAgICAgcmV0dXJuICgwKTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgeG1sU2NoZW1hVHlwZVB0cgogeG1sU2NoZW1hUXVlcnlCdWlsdEluVHlwZSh4bWxTY2hlbWFUeXBlUHRyIHR5cGUpCkBAIC0xMzMxOSw2ICsxMzMxOCw3IEBACiAJcmV0dXJuKHR5cGUpOwogICAgIHJldHVybih4bWxTY2hlbWFRdWVyeUJ1aWx0SW5UeXBlKHR5cGUtPnN1YnR5cGVzKSk7CiB9CisjZW5kaWYKIAogLyoqCiAgKiB4bWxTY2hlbWFHZXRQcmltaXRpdmVUeXBlOgpAQCAtMTM0ODgsNyArMTM0ODgsNyBAQAogCXJldHVybiAoMCk7CiAgICAgfQogICAgIC8qCi0gICAgKiAzIElmIGJvdGggTzEgYW5kIE8yIGFyZSBzZXRzIG9mIChuYW1lc3BhY2UgbmFtZXMgb3Igt2Fic2VudLcpLAorICAgICogMyBJZiBib3RoIE8xIGFuZCBPMiBhcmUgc2V0cyBvZiAobmFtZXNwYWNlIG5hbWVzIG9yIO+/vWFic2VudO+/vSksCiAgICAgKiB0aGVuIHRoZSB1bmlvbiBvZiB0aG9zZSBzZXRzIG11c3QgYmUgdGhlIHZhbHVlLgogICAgICovCiAgICAgaWYgKChjb21wbGV0ZVdpbGQtPm5zU2V0ICE9IE5VTEwpICYmIChjdXJXaWxkLT5uc1NldCAhPSBOVUxMKSkgewpAQCAtMTM1MjIsNyArMTM1MjIsNyBAQAogICAgIH0KICAgICAvKgogICAgICogNCBJZiB0aGUgdHdvIGFyZSBuZWdhdGlvbnMgb2YgZGlmZmVyZW50IHZhbHVlcyAobmFtZXNwYWNlIG5hbWVzCi0gICAgKiBvciC3YWJzZW50tyksIHRoZW4gYSBwYWlyIG9mIG5vdCBhbmQgt2Fic2VudLcgbXVzdCBiZSB0aGUgdmFsdWUuCisgICAgKiBvciDvv71hYnNlbnTvv70pLCB0aGVuIGEgcGFpciBvZiBub3QgYW5kIO+/vWFic2VudO+/vSBtdXN0IGJlIHRoZSB2YWx1ZS4KICAgICAqLwogICAgIGlmICgoY29tcGxldGVXaWxkLT5uZWdOc1NldCAhPSBOVUxMKSAmJgogCShjdXJXaWxkLT5uZWdOc1NldCAhPSBOVUxMKSAmJgpAQCAtMTM1NjQsNyArMTM1NjQsNyBAQAogCWlmIChuc0ZvdW5kICYmIGFic2VudEZvdW5kKSB7CiAJICAgIC8qCiAJICAgICogNS4xIElmIHRoZSBzZXQgUyBpbmNsdWRlcyBib3RoIHRoZSBuZWdhdGVkIG5hbWVzcGFjZQotCSAgICAqIG5hbWUgYW5kILdhYnNlbnS3LCB0aGVuIGFueSBtdXN0IGJlIHRoZSB2YWx1ZS4KKwkgICAgKiBuYW1lIGFuZCDvv71hYnNlbnTvv70sIHRoZW4gYW55IG11c3QgYmUgdGhlIHZhbHVlLgogCSAgICAqLwogCSAgICBjb21wbGV0ZVdpbGQtPmFueSA9IDE7CiAJICAgIGlmIChjb21wbGV0ZVdpbGQtPm5zU2V0ICE9IE5VTEwpIHsKQEAgLTEzNTc4LDcgKzEzNTc4LDcgQEAKIAl9IGVsc2UgaWYgKG5zRm91bmQgJiYgKCFhYnNlbnRGb3VuZCkpIHsKIAkgICAgLyoKIAkgICAgKiA1LjIgSWYgdGhlIHNldCBTIGluY2x1ZGVzIHRoZSBuZWdhdGVkIG5hbWVzcGFjZSBuYW1lCi0JICAgICogYnV0IG5vdCC3YWJzZW50tywgdGhlbiBhIHBhaXIgb2Ygbm90IGFuZCC3YWJzZW50tyBtdXN0CisJICAgICogYnV0IG5vdCDvv71hYnNlbnTvv70sIHRoZW4gYSBwYWlyIG9mIG5vdCBhbmQg77+9YWJzZW5077+9IG11c3QKIAkgICAgKiBiZSB0aGUgdmFsdWUuCiAJICAgICovCiAJICAgIGlmIChjb21wbGV0ZVdpbGQtPm5zU2V0ICE9IE5VTEwpIHsKQEAgLTEzNTkzLDcgKzEzNTkzLDcgQEAKIAkgICAgY29tcGxldGVXaWxkLT5uZWdOc1NldC0+dmFsdWUgPSBOVUxMOwogCX0gZWxzZSBpZiAoKCFuc0ZvdW5kKSAmJiBhYnNlbnRGb3VuZCkgewogCSAgICAvKgotCSAgICAqIDUuMyBJZiB0aGUgc2V0IFMgaW5jbHVkZXMgt2Fic2VudLcgYnV0IG5vdCB0aGUgbmVnYXRlZAorCSAgICAqIDUuMyBJZiB0aGUgc2V0IFMgaW5jbHVkZXMg77+9YWJzZW5077+9IGJ1dCBub3QgdGhlIG5lZ2F0ZWQKIAkgICAgKiBuYW1lc3BhY2UgbmFtZSwgdGhlbiB0aGUgdW5pb24gaXMgbm90IGV4cHJlc3NpYmxlLgogCSAgICAqLwogCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGNvbXBsZXRlV2lsZC0+bm9kZSwKQEAgLTEzNjA0LDcgKzEzNjA0LDcgQEAKIAl9IGVsc2UgaWYgKCghbnNGb3VuZCkgJiYgKCFhYnNlbnRGb3VuZCkpIHsKIAkgICAgLyoKIAkgICAgKiA1LjQgSWYgdGhlIHNldCBTIGRvZXMgbm90IGluY2x1ZGUgZWl0aGVyIHRoZSBuZWdhdGVkIG5hbWVzcGFjZQotCSAgICAqIG5hbWUgb3Igt2Fic2VudLcsIHRoZW4gd2hpY2hldmVyIG9mIE8xIG9yIE8yIGlzIGEgcGFpciBvZiBub3QKKwkgICAgKiBuYW1lIG9yIO+/vWFic2VudO+/vSwgdGhlbiB3aGljaGV2ZXIgb2YgTzEgb3IgTzIgaXMgYSBwYWlyIG9mIG5vdAogCSAgICAqIGFuZCBhIG5hbWVzcGFjZSBuYW1lIG11c3QgYmUgdGhlIHZhbHVlLgogCSAgICAqLwogCSAgICBpZiAoY29tcGxldGVXaWxkLT5uZWdOc1NldCA9PSBOVUxMKSB7CkBAIC0xMzYzOCw3ICsxMzYzOCw3IEBACiAJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CiAJICAgIGlmIChjdXItPnZhbHVlID09IE5VTEwpIHsKIAkJLyoKLQkJKiA2LjEgSWYgdGhlIHNldCBTIGluY2x1ZGVzILdhYnNlbnS3LCB0aGVuIGFueSBtdXN0IGJlIHRoZQorCQkqIDYuMSBJZiB0aGUgc2V0IFMgaW5jbHVkZXMg77+9YWJzZW5077+9LCB0aGVuIGFueSBtdXN0IGJlIHRoZQogCQkqIHZhbHVlLgogCQkqLwogCQljb21wbGV0ZVdpbGQtPmFueSA9IDE7CkBAIC0xMzY1Niw4ICsxMzY1Niw4IEBACiAJfQogCWlmIChjb21wbGV0ZVdpbGQtPm5lZ05zU2V0ID09IE5VTEwpIHsKIAkgICAgLyoKLQkgICAgKiA2LjIgSWYgdGhlIHNldCBTIGRvZXMgbm90IGluY2x1ZGUgt2Fic2VudLcsIHRoZW4gYSBwYWlyIG9mIG5vdAotCSAgICAqIGFuZCC3YWJzZW50tyBtdXN0IGJlIHRoZSB2YWx1ZS4KKwkgICAgKiA2LjIgSWYgdGhlIHNldCBTIGRvZXMgbm90IGluY2x1ZGUg77+9YWJzZW5077+9LCB0aGVuIGEgcGFpciBvZiBub3QKKwkgICAgKiBhbmQg77+9YWJzZW5077+9IG11c3QgYmUgdGhlIHZhbHVlLgogCSAgICAqLwogCSAgICBpZiAoY29tcGxldGVXaWxkLT5uc1NldCAhPSBOVUxMKSB7CiAJCXhtbFNjaGVtYUZyZWVXaWxkY2FyZE5zU2V0KGNvbXBsZXRlV2lsZC0+bnNTZXQpOwpAQCAtMTM3NDAsOSArMTM3NDAsOSBAQAogICAgIH0KICAgICAvKgogICAgICogMyBJZiBlaXRoZXIgTzEgb3IgTzIgaXMgYSBwYWlyIG9mIG5vdCBhbmQgYSB2YWx1ZSAoYSBuYW1lc3BhY2UKLSAgICAqIG5hbWUgb3Igt2Fic2VudLcpIGFuZCB0aGUgb3RoZXIgaXMgYSBzZXQgb2YgKG5hbWVzcGFjZSBuYW1lcyBvcgotICAgICogt2Fic2VudLcpLCB0aGVuIHRoYXQgc2V0LCBtaW51cyB0aGUgbmVnYXRlZCB2YWx1ZSBpZiBpdCB3YXMgaW4KLSAgICAqIHRoZSBzZXQsIG1pbnVzILdhYnNlbnS3IGlmIGl0IHdhcyBpbiB0aGUgc2V0LCBtdXN0IGJlIHRoZSB2YWx1ZS4KKyAgICAqIG5hbWUgb3Ig77+9YWJzZW5077+9KSBhbmQgdGhlIG90aGVyIGlzIGEgc2V0IG9mIChuYW1lc3BhY2UgbmFtZXMgb3IKKyAgICAqIO+/vWFic2VudO+/vSksIHRoZW4gdGhhdCBzZXQsIG1pbnVzIHRoZSBuZWdhdGVkIHZhbHVlIGlmIGl0IHdhcyBpbgorICAgICogdGhlIHNldCwgbWludXMg77+9YWJzZW5077+9IGlmIGl0IHdhcyBpbiB0aGUgc2V0LCBtdXN0IGJlIHRoZSB2YWx1ZS4KICAgICAqLwogICAgIGlmICgoKGNvbXBsZXRlV2lsZC0+bmVnTnNTZXQgIT0gTlVMTCkgJiYgKGN1cldpbGQtPm5zU2V0ICE9IE5VTEwpKSB8fAogCSgoY3VyV2lsZC0+bmVnTnNTZXQgIT0gTlVMTCkgJiYgKGNvbXBsZXRlV2lsZC0+bnNTZXQgIT0gTlVMTCkpKSB7CkBAIC0xMzc5MSw3ICsxMzc5MSw3IEBACiAJcmV0dXJuKDApOwogICAgIH0KICAgICAvKgotICAgICogNCBJZiBib3RoIE8xIGFuZCBPMiBhcmUgc2V0cyBvZiAobmFtZXNwYWNlIG5hbWVzIG9yILdhYnNlbnS3KSwKKyAgICAqIDQgSWYgYm90aCBPMSBhbmQgTzIgYXJlIHNldHMgb2YgKG5hbWVzcGFjZSBuYW1lcyBvciDvv71hYnNlbnTvv70pLAogICAgICogdGhlbiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRob3NlIHNldHMgbXVzdCBiZSB0aGUgdmFsdWUuCiAgICAgKi8KICAgICBpZiAoKGNvbXBsZXRlV2lsZC0+bnNTZXQgIT0gTlVMTCkgJiYgKGN1cldpbGQtPm5zU2V0ICE9IE5VTEwpKSB7CkBAIC0xMzg0MSw3ICsxMzg0MSw3IEBACiAgICAgfQogICAgIC8qCiAgICAgKiA2IElmIHRoZSBvbmUgaXMgYSBuZWdhdGlvbiBvZiBhIG5hbWVzcGFjZSBuYW1lIGFuZCB0aGUgb3RoZXIKLSAgICAqIGlzIGEgbmVnYXRpb24gb2Ygt2Fic2VudLcsIHRoZW4gdGhlIG9uZSB3aGljaCBpcyB0aGUgbmVnYXRpb24KKyAgICAqIGlzIGEgbmVnYXRpb24gb2Yg77+9YWJzZW5077+9LCB0aGVuIHRoZSBvbmUgd2hpY2ggaXMgdGhlIG5lZ2F0aW9uCiAgICAgKiBvZiBhIG5hbWVzcGFjZSBuYW1lIG11c3QgYmUgdGhlIHZhbHVlLgogICAgICovCiAgICAgaWYgKChjb21wbGV0ZVdpbGQtPm5lZ05zU2V0ICE9IE5VTEwpICYmIChjdXJXaWxkLT5uZWdOc1NldCAhPSBOVUxMKSAmJgpAQCAtMTM4NzMsNyArMTM4NzMsNyBAQAogICAgIGlmIChzdXBlci0+YW55KQogCXJldHVybiAoMCk7CiAgICAgLyoKLSAgICAqIDIuMSBzdWIgbXVzdCBiZSBhIHBhaXIgb2Ygbm90IGFuZCBhIG5hbWVzcGFjZSBuYW1lIG9yILdhYnNlbnS3LgorICAgICogMi4xIHN1YiBtdXN0IGJlIGEgcGFpciBvZiBub3QgYW5kIGEgbmFtZXNwYWNlIG5hbWUgb3Ig77+9YWJzZW5077+9LgogICAgICogMi4yIHN1cGVyIG11c3QgYmUgYSBwYWlyIG9mIG5vdCBhbmQgdGhlIHNhbWUgdmFsdWUuCiAgICAgKi8KICAgICBpZiAoKHN1Yi0+bmVnTnNTZXQgIT0gTlVMTCkgJiYKQEAgLTEzODgxLDcgKzEzODgxLDcgQEAKIAkoc3ViLT5uZWdOc1NldC0+dmFsdWUgPT0gc3ViLT5uZWdOc1NldC0+dmFsdWUpKQogCXJldHVybiAoMCk7CiAgICAgLyoKLSAgICAqIDMuMSBzdWIgbXVzdCBiZSBhIHNldCB3aG9zZSBtZW1iZXJzIGFyZSBlaXRoZXIgbmFtZXNwYWNlIG5hbWVzIG9yILdhYnNlbnS3LgorICAgICogMy4xIHN1YiBtdXN0IGJlIGEgc2V0IHdob3NlIG1lbWJlcnMgYXJlIGVpdGhlciBuYW1lc3BhY2UgbmFtZXMgb3Ig77+9YWJzZW5077+9LgogICAgICovCiAgICAgaWYgKHN1Yi0+bnNTZXQgIT0gTlVMTCkgewogCS8qCkBAIC0xMzkxMiw3ICsxMzkxMiw3IEBACiAJICAgIHhtbFNjaGVtYVdpbGRjYXJkTnNQdHIgY3VyOwogCSAgICAvKgogCSAgICAqIDMuMi4yIHN1cGVyIG11c3QgYmUgYSBwYWlyIG9mIG5vdCBhbmQgYSBuYW1lc3BhY2UgbmFtZSBvcgotCSAgICAqILdhYnNlbnS3IGFuZCB0aGF0IHZhbHVlIG11c3Qgbm90IGJlIGluIHN1YidzIHNldC4KKwkgICAgKiDvv71hYnNlbnTvv70gYW5kIHRoYXQgdmFsdWUgbXVzdCBub3QgYmUgaW4gc3ViJ3Mgc2V0LgogCSAgICAqLwogCSAgICBjdXIgPSBzdWItPm5zU2V0OwogCSAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKQEAgLTEzOTM3LDcgKzEzOTM3LDcgQEAKICAgICBpZiAodmFsICE9IDApCiAJKnZhbCA9IE5VTEw7CiAKLSAgICBpZiAoYXR0cnVzZS0+ZGVmVmFsdWUgIT0gTlVMTCkgewkgICAgCisgICAgaWYgKGF0dHJ1c2UtPmRlZlZhbHVlICE9IE5VTEwpIHsKIAkqdmFsdWUgPSBhdHRydXNlLT5kZWZWYWx1ZTsKIAlpZiAodmFsICE9IE5VTEwpCiAJICAgICp2YWwgPSBhdHRydXNlLT5kZWZWYWw7CkBAIC0xNDAxNywxMiArMTQwMTcsMTIgQEAKIAkJCQkgICAgICAgeG1sU2NoZW1hSXRlbUxpc3RQdHIgYmFzZVVzZXMsCiAJCQkJICAgICAgIHhtbFNjaGVtYVdpbGRjYXJkUHRyIHdpbGQsCiAJCQkJICAgICAgIHhtbFNjaGVtYVdpbGRjYXJkUHRyIGJhc2VXaWxkKQoteyAgICAgICAgCit7CiAgICAgeG1sU2NoZW1hQXR0cmlidXRlVXNlUHRyIGN1ciA9IE5VTEwsIGJjdXI7CiAgICAgaW50IGksIGosIGZvdW5kOyAvKiBlcnIgPSAwOyAqLwogICAgIGNvbnN0IHhtbENoYXIgKmJFZmZWYWx1ZTsKICAgICBpbnQgZWZmRml4ZWQ7Ci0gICAgCisKICAgICBpZiAodXNlcyAhPSBOVUxMKSB7CiAJZm9yIChpID0gMDsgaSA8IHVzZXMtPm5iSXRlbXM7IGkrKykgewogCSAgICBjdXIgPSB1c2VzLT5pdGVtc1tpXTsKQEAgLTE0MDMwLDcgKzE0MDMwLDcgQEAKIAkgICAgaWYgKGJhc2VVc2VzID09IE5VTEwpCiAJCWdvdG8gbm90X2ZvdW5kOwogCSAgICBmb3IgKGogPSAwOyBqIDwgYmFzZVVzZXMtPm5iSXRlbXM7IGorKykgewotCQliY3VyID0gYmFzZVVzZXMtPml0ZW1zW2pdOwkKKwkJYmN1ciA9IGJhc2VVc2VzLT5pdGVtc1tqXTsKIAkJaWYgKChXWFNfQVRUUlVTRV9ERUNMX05BTUUoY3VyKSA9PQogCQkJV1hTX0FUVFJVU0VfREVDTF9OQU1FKGJjdXIpKSAmJgogCQkgICAgKFdYU19BVFRSVVNFX0RFQ0xfVE5TKGN1cikgPT0KQEAgLTE0MDQzLDcgKzE0MDQzLDcgQEAKIAkJICAgICogbmFtZXNwYWNlfSwgdGhlbiAgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiIKIAkJICAgICovCiAJCSAgICBmb3VuZCA9IDE7Ci0JCSAgICAKKwogCQkgICAgaWYgKChjdXItPm9jY3VycyA9PSBYTUxfU0NIRU1BU19BVFRSX1VTRV9PUFRJT05BTCkgJiYKIAkJCShiY3VyLT5vY2N1cnMgPT0gWE1MX1NDSEVNQVNfQVRUUl9VU0VfUkVRVUlSRUQpKQogCQkgICAgewpAQCAtMTQwNjksMTIgKzE0MDY5LDEyIEBACiAJCQlXWFNfQVRUUlVTRV9UWVBFREVGKGJjdXIpLCAwKSAhPSAwKQogCQkgICAgewogCQkJeG1sQ2hhciAqc3RyQSA9IE5VTEwsICpzdHJCID0gTlVMTCwgKnN0ckMgPSBOVUxMOwotCQkJCisKIAkJCS8qCiAJCQkqIFNQRUMgKDIuMS4yKSAiUidzIHthdHRyaWJ1dGUgZGVjbGFyYXRpb259J3MKIAkJCSoge3R5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSB2YWxpZGx5IGRlcml2ZWQgZnJvbQogCQkJKiBCJ3Mge3R5cGUgZGVmaW5pdGlvbn0gZ2l2ZW4gdGhlIGVtcHR5IHNldCBhcwotCQkJKiBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNikuIgorCQkJKiBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAo77+9My4xNC42KS4iCiAJCQkqLwogCQkJeG1sU2NoZW1hUEF0dHJVc2VFcnI0KHBjdHh0LAogCQkJICAgIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMl8xXzIsCkBAIC0xNDEwNiwxNyArMTQxMDYsMTcgQEAKIAkJCS8qCiAJCQkqIDIuMS4zIC4uLiBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWUKIAkJCSoKLQkJCSogMi4xLjMuMSBCJ3Mgt2VmZmVjdGl2ZSB2YWx1ZSBjb25zdHJhaW50tyBpcwotCQkJKiC3YWJzZW50tyBvciBkZWZhdWx0LgorCQkJKiAyLjEuMy4xIEIncyDvv71lZmZlY3RpdmUgdmFsdWUgY29uc3RyYWludO+/vSBpcworCQkJKiDvv71hYnNlbnTvv70gb3IgZGVmYXVsdC4KIAkJCSovCiAJCQlpZiAoKGJFZmZWYWx1ZSAhPSBOVUxMKSAmJgogCQkJICAgIChlZmZGaXhlZCA9PSAxKSkgewogCQkJICAgIGNvbnN0IHhtbENoYXIgKnJFZmZWYWx1ZSA9IE5VTEw7Ci0JCQkgICAgCisKIAkJCSAgICB4bWxTY2hlbWFHZXRFZmZlY3RpdmVWYWx1ZUNvbnN0cmFpbnQoYmN1ciwKIAkJCQkmZWZmRml4ZWQsICZyRWZmVmFsdWUsIE5VTEwpOwogCQkJICAgIC8qCi0JCQkgICAgKiAyLjEuMy4yIFIncyC3ZWZmZWN0aXZlIHZhbHVlIGNvbnN0cmFpbnS3IGlzCisJCQkgICAgKiAyLjEuMy4yIFIncyDvv71lZmZlY3RpdmUgdmFsdWUgY29uc3RyYWludO+/vSBpcwogCQkJICAgICogZml4ZWQgd2l0aCB0aGUgc2FtZSBzdHJpbmcgYXMgQidzLgogCQkJICAgICogTUFZQkUgVE9ETzogQ29tcGFyZSB0aGUgY29tcHV0ZWQgdmFsdWVzLgogCQkJICAgICogICAgICAgSG1tLCBpdCBzYXlzICJzYW1lIHN0cmluZyIgc28KQEAgLTE0MTI2LDcgKzE0MTI2LDcgQEAKIAkJCQkoISBXWFNfQVJFX0RFRkFVTFRfU1RSX0VRVUFMKHJFZmZWYWx1ZSwgYkVmZlZhbHVlKSkpCiAJCQkgICAgewogCQkJCXhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JCQkJCisKIAkJCQl4bWxTY2hlbWFQQXR0clVzZUVycjQocGN0eHQsCiAJCQkJICAgIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMl8xXzMsCiAJCQkJICAgIFdYU19JVEVNX05PREUoaXRlbSksIGl0ZW0sIGN1ciwKQEAgLTE0MTQ1LDIxICsxNDE0NSwyMSBAQAogCQkgICAgYnJlYWs7CiAJCX0KIAkgICAgfQotbm90X2ZvdW5kOgkKK25vdF9mb3VuZDoKIAkgICAgaWYgKCFmb3VuZCkgewogCQkvKgogCQkqICgyLjIpICJvdGhlcndpc2UgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBoYXZlIGFuCiAJCSoge2F0dHJpYnV0ZSB3aWxkY2FyZH0gYW5kIHRoZSB7dGFyZ2V0IG5hbWVzcGFjZX0gb2YgdGhlCi0JCSogUidzIHthdHRyaWJ1dGUgZGVjbGFyYXRpb259IG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QKKwkJKiBSJ3Mge2F0dHJpYnV0ZSBkZWNsYXJhdGlvbn0gbXVzdCBiZSDvv712YWxpZO+/vSB3aXRoIHJlc3BlY3QKIAkJKiB0byB0aGF0IHdpbGRjYXJkLCBhcyBkZWZpbmVkIGluIFdpbGRjYXJkIGFsbG93cyBOYW1lc3BhY2UKLQkJKiBOYW1lICinMy4xMC40KS4iCisJCSogTmFtZSAo77+9My4xMC40KS4iCiAJCSovCiAJCWlmICgoYmFzZVdpbGQgPT0gTlVMTCkgfHwKIAkJICAgICh4bWxTY2hlbWFDaGVja0NWQ1dpbGRjYXJkTmFtZXNwYWNlKGJhc2VXaWxkLAogCQkgICAgKFdYU19BVFRSVVNFX0RFQ0woY3VyKSktPnRhcmdldE5hbWVzcGFjZSkgIT0gMCkpCiAJCXsKIAkJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JCSAgICAKKwogCQkgICAgeG1sU2NoZW1hUEF0dHJVc2VFcnI0KHBjdHh0LAogCQkJWE1MX1NDSEVNQVBfREVSSVZBVElPTl9PS19SRVNUUklDVElPTl8yXzIsCiAJCQlXWFNfSVRFTV9OT0RFKGl0ZW0pLCBpdGVtLCBjdXIsCkBAIC0xNDE3NSw3ICsxNDE3NSw3IEBACiAJfQogICAgIH0KICAgICAvKgotICAgICogU1BFQyBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uICgzKTogICAgCisgICAgKiBTUEVDIGRlcml2YXRpb24tb2stcmVzdHJpY3Rpb24gKDMpOgogICAgICogKDMpICJGb3IgZWFjaCBhdHRyaWJ1dGUgdXNlIGluIHRoZSB7YXR0cmlidXRlIHVzZXN9IG9mIHRoZSB7YmFzZSB0eXBlCiAgICAgKiBkZWZpbml0aW9ufSB3aG9zZSB7cmVxdWlyZWR9IGlzIHRydWUsIHRoZXJlIG11c3QgYmUgYW4gYXR0cmlidXRlCiAgICAgKiB1c2Ugd2l0aCBhbiB7YXR0cmlidXRlIGRlY2xhcmF0aW9ufSB3aXRoIHRoZSBzYW1lIHtuYW1lfSBhbmQKQEAgLTE0MTkwLDcgKzE0MTkwLDcgQEAKIAkgICAgZm91bmQgPSAwOwogCSAgICBpZiAodXNlcyAhPSBOVUxMKSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1c2VzLT5uYkl0ZW1zOyBpKyspIHsKLQkJICAgIGN1ciA9IHVzZXMtPml0ZW1zW2ldOwkKKwkJICAgIGN1ciA9IHVzZXMtPml0ZW1zW2ldOwogCQkgICAgaWYgKChXWFNfQVRUUlVTRV9ERUNMX05BTUUoY3VyKSA9PQogCQkJV1hTX0FUVFJVU0VfREVDTF9OQU1FKGJjdXIpKSAmJgogCQkJKFdYU19BVFRSVVNFX0RFQ0xfVE5TKGN1cikgPT0KQEAgLTE0MjAyLDcgKzE0MjAyLDcgQEAKIAkgICAgfQogCSAgICBpZiAoIWZvdW5kKSB7CiAJCXhtbENoYXIgKnN0ckEgPSBOVUxMLCAqc3RyQiA9IE5VTEw7Ci0JCQorCiAJCXhtbFNjaGVtYUN1c3RvbUVycjQoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJICAgIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMywKIAkJICAgIE5VTEwsIGl0ZW0sCkBAIC0xNDIyNCwxOSArMTQyMjQsMTkgQEAKIAkvKgogCSogKDQpICJJZiB0aGVyZSBpcyBhbiB7YXR0cmlidXRlIHdpbGRjYXJkfSwgYWxsIG9mIHRoZQogCSogZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToiCi0JKi8gICAKKwkqLwogCWlmIChiYXNlV2lsZCA9PSBOVUxMKSB7CiAJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CiAKIAkgICAgLyoKIAkgICAgKiAoNC4xKSAiVGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBhbHNvIGhhdmUgb25lLiIKLQkgICAgKi8JICAgIAorCSAgICAqLwogCSAgICB4bWxTY2hlbWFDdXN0b21FcnI0KEFDVFhUX0NBU1QgcGN0eHQsCiAJCVhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fNF8xLAogCQlOVUxMLCBpdGVtLAogCQkiVGhlICVzIGhhcyBhbiBhdHRyaWJ1dGUgd2lsZGNhcmQsICIKIAkJImJ1dCB0aGUgJXMgJXMgJyVzJyBkb2VzIG5vdCBoYXZlIG9uZSIsCi0JCVdYU19JVEVNX1RZUEVfTkFNRShpdGVtKSwJCSAgICAKKwkJV1hTX0lURU1fVFlQRV9OQU1FKGl0ZW0pLAogCQlXWFNfQUNUSU9OX1NUUihhY3Rpb24pLAogCQlXWFNfSVRFTV9UWVBFX05BTUUoYmFzZUl0ZW0pLAogCQl4bWxTY2hlbWFHZXRDb21wb25lbnRRTmFtZSgmc3RyLCBiYXNlSXRlbSkpOwpAQCAtMTQyNTAsNyArMTQyNTAsNyBAQAogCSAgICAqICg0LjIpICJUaGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24ncyB7YXR0cmlidXRlIHdpbGRjYXJkfSdzCiAJICAgICoge25hbWVzcGFjZSBjb25zdHJhaW50fSBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSB7YmFzZSB0eXBlCiAJICAgICogZGVmaW5pdGlvbn0ncyB7YXR0cmlidXRlIHdpbGRjYXJkfSdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0sCi0JICAgICogYXMgZGVmaW5lZCBieSBXaWxkY2FyZCBTdWJzZXQgKKczLjEwLjYpLiIKKwkgICAgKiBhcyBkZWZpbmVkIGJ5IFdpbGRjYXJkIFN1YnNldCAo77+9My4xMC42KS4iCiAJICAgICovCiAJICAgIHhtbFNjaGVtYUN1c3RvbUVycjQoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJWE1MX1NDSEVNQVBfREVSSVZBVElPTl9PS19SRVNUUklDVElPTl80XzIsCkBAIC0xNDI2NCw4ICsxNDI2NCw4IEBACiAJICAgIEZSRUVfQU5EX05VTEwoc3RyKTsKIAkgICAgcmV0dXJuKHBjdHh0LT5lcnIpOwogCX0KLQkvKiA0LjMgVW5sZXNzIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIHRoZSC3dXItdHlwZQotCSogZGVmaW5pdGlvbrcsIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbidzIHthdHRyaWJ1dGUKKwkvKiA0LjMgVW5sZXNzIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIHRoZSDvv711ci10eXBlCisJKiBkZWZpbml0aW9u77+9LCB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24ncyB7YXR0cmlidXRlCiAJKiB3aWxkY2FyZH0ncyB7cHJvY2VzcyBjb250ZW50c30gbXVzdCBiZSBpZGVudGljYWwgdG8gb3IKIAkqIHN0cm9uZ2VyIHRoYW4gdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0ncyB7YXR0cmlidXRlCiAJKiB3aWxkY2FyZH0ncyB7cHJvY2VzcyBjb250ZW50c30sIHdoZXJlIHN0cmljdCBpcyBzdHJvbmdlcgpAQCAtMTQzMTYsNyArMTQzMTYsNyBAQAogCQkJCSAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlKQogewogICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZVR5cGUgPSBOVUxMOwotICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVVzZVB0ciB1c2U7ICAgIAorICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVVzZVB0ciB1c2U7CiAgICAgeG1sU2NoZW1hSXRlbUxpc3RQdHIgdXNlcywgYmFzZVVzZXMsIHByb2hpYnMgPSBOVUxMOwogCiAgICAgaWYgKHR5cGUtPmJhc2VUeXBlID09IE5VTEwpIHsKQEAgLTE0MzI0LDcgKzE0MzI0LDcgQEAKIAkgICAgIm5vIGJhc2UgdHlwZSIpOwogICAgICAgICByZXR1cm4gKC0xKTsKICAgICB9Ci0gICAgYmFzZVR5cGUgPSB0eXBlLT5iYXNlVHlwZTsgICAgICAgIAorICAgIGJhc2VUeXBlID0gdHlwZS0+YmFzZVR5cGU7CiAgICAgaWYgKFdYU19JU19UWVBFX05PVF9GSVhFRChiYXNlVHlwZSkpCiAJaWYgKHhtbFNjaGVtYVR5cGVGaXh1cChiYXNlVHlwZSwgQUNUWFRfQ0FTVCBwY3R4dCkgPT0gLTEpCiAJICAgIHJldHVybigtMSk7CkBAIC0xNDMzNiw3ICsxNDMzNiw3IEBACiAgICAgKiB3aWxkY2FyZCwgaS5lLiBpbnRlcnNlY3QgbXVsdGlwbGUgd2lsZGNhcmRzLgogICAgICogTW92ZSBhdHRyaWJ1dGUgcHJvaGliaXRpb25zIGludG8gYSBzZXBhcmF0ZSBsaXN0LgogICAgICovCi0gICAgaWYgKHVzZXMgIT0gTlVMTCkgewkKKyAgICBpZiAodXNlcyAhPSBOVUxMKSB7CiAJaWYgKFdYU19JU19SRVNUUklDVElPTih0eXBlKSkgewogCSAgICAvKgogCSAgICAqIFRoaXMgb25lIHdpbGwgdHJhbnNmZXIgYWxsIGF0dHIuIHByb2hpYml0aW9ucwpAQCAtMTQzNzAsNyArMTQzNzAsNyBAQAogCiAJaWYgKFdYU19JU19SRVNUUklDVElPTih0eXBlKSkgewogCSAgICBpbnQgdXNlc0NvdW50OwotCSAgICB4bWxTY2hlbWFBdHRyaWJ1dGVVc2VQdHIgdG1wOyAKKwkgICAgeG1sU2NoZW1hQXR0cmlidXRlVXNlUHRyIHRtcDsKIAogCSAgICBpZiAodXNlcyAhPSBOVUxMKQogCQl1c2VzQ291bnQgPSB1c2VzLT5uYkl0ZW1zOwpAQCAtMTQ0MjAsMTUgKzE0NDIwLDE1IEBACiAJICAgIH0KIAl9IGVsc2UgewogCSAgICAvKiBFeHRlbnNpb24uICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBiYXNlVXNlcy0+bmJJdGVtczsgaSsrKSB7CSAgICAKLQkJdXNlID0gYmFzZVVzZXMtPml0ZW1zW2ldOwkJCisJICAgIGZvciAoaSA9IDA7IGkgPCBiYXNlVXNlcy0+bmJJdGVtczsgaSsrKSB7CisJCXVzZSA9IGJhc2VVc2VzLT5pdGVtc1tpXTsKIAkJaWYgKHVzZXMgPT0gTlVMTCkgewogCQkgICAgdHlwZS0+YXR0clVzZXMgPSB4bWxTY2hlbWFJdGVtTGlzdENyZWF0ZSgpOwogCQkgICAgaWYgKHR5cGUtPmF0dHJVc2VzID09IE5VTEwpCiAJCQlnb3RvIGV4aXRfZmFpbHVyZTsKIAkJICAgIHVzZXMgPSB0eXBlLT5hdHRyVXNlczsKIAkJfQotCQl4bWxTY2hlbWFJdGVtTGlzdEFkZFNpemUodXNlcywgYmFzZVVzZXMtPm5iSXRlbXMsIHVzZSk7IAorCQl4bWxTY2hlbWFJdGVtTGlzdEFkZFNpemUodXNlcywgYmFzZVVzZXMtPm5iSXRlbXMsIHVzZSk7CiAJICAgIH0KIAl9CiAgICAgfQpAQCAtMTQ0NDgsMTAgKzE0NDQ4LDEwIEBACiAgICAgLyoKICAgICAqIENvbXB1dGUgdGhlIGNvbXBsZXRlIHdpbGRjYXJkLgogICAgICovCi0gICAgaWYgKFdYU19JU19FWFRFTlNJT04odHlwZSkpIHsJCisgICAgaWYgKFdYU19JU19FWFRFTlNJT04odHlwZSkpIHsKIAlpZiAoYmFzZVR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkICE9IE5VTEwpIHsKIAkgICAgLyoKLQkgICAgKiAoMy4yLjIuMSkgIklmIHRoZSC3YmFzZSB3aWxkY2FyZLcgaXMgbm9uLbdhYnNlbnS3LCB0aGVuCisJICAgICogKDMuMi4yLjEpICJJZiB0aGUg77+9YmFzZSB3aWxkY2FyZO+/vSBpcyBub24t77+9YWJzZW5077+9LCB0aGVuCiAJICAgICogdGhlIGFwcHJvcHJpYXRlIGNhc2UgYW1vbmcgdGhlIGZvbGxvd2luZzoiCiAJICAgICovCiAJICAgIGlmICh0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCAhPSBOVUxMKSB7CkBAIC0xNDQ1OSwyNiArMTQ0NTksMjYgQEAKIAkJKiBVbmlvbiB0aGUgY29tcGxldGUgd2lsZGNhcmQgd2l0aCB0aGUgYmFzZSB3aWxkY2FyZC4KIAkJKiBTUEVDIHthdHRyaWJ1dGUgd2lsZGNhcmR9CiAJCSogKDMuMi4yLjEuMikgIm90aGVyd2lzZSBhIHdpbGRjYXJkIHdob3NlIHtwcm9jZXNzIGNvbnRlbnRzfQotCQkqIGFuZCB7YW5ub3RhdGlvbn0gYXJlIHRob3NlIG9mIHRoZSC3Y29tcGxldGUgd2lsZGNhcmS3LAorCQkqIGFuZCB7YW5ub3RhdGlvbn0gYXJlIHRob3NlIG9mIHRoZSDvv71jb21wbGV0ZSB3aWxkY2FyZO+/vSwKIAkJKiBhbmQgd2hvc2Uge25hbWVzcGFjZSBjb25zdHJhaW50fSBpcyB0aGUgaW50ZW5zaW9uYWwgdW5pb24KLQkJKiBvZiB0aGUge25hbWVzcGFjZSBjb25zdHJhaW50fSBvZiB0aGUgt2NvbXBsZXRlIHdpbGRjYXJktwotCQkqIGFuZCBvZiB0aGUgt2Jhc2Ugd2lsZGNhcmS3LCBhcyBkZWZpbmVkIGluIEF0dHJpYnV0ZQotCQkqIFdpbGRjYXJkIFVuaW9uICinMy4xMC42KS4iCisJCSogb2YgdGhlIHtuYW1lc3BhY2UgY29uc3RyYWludH0gb2YgdGhlIO+/vWNvbXBsZXRlIHdpbGRjYXJk77+9CisJCSogYW5kIG9mIHRoZSDvv71iYXNlIHdpbGRjYXJk77+9LCBhcyBkZWZpbmVkIGluIEF0dHJpYnV0ZQorCQkqIFdpbGRjYXJkIFVuaW9uICjvv70zLjEwLjYpLiIKIAkJKi8KIAkJaWYgKHhtbFNjaGVtYVVuaW9uV2lsZGNhcmRzKHBjdHh0LCB0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCwKIAkJICAgIGJhc2VUeXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCkgPT0gLTEpCi0JCSAgICBnb3RvIGV4aXRfZmFpbHVyZTsJCQorCQkgICAgZ290byBleGl0X2ZhaWx1cmU7CiAJICAgIH0gZWxzZSB7CiAJCS8qCi0JCSogKDMuMi4yLjEuMSkgIklmIHRoZSC3Y29tcGxldGUgd2lsZGNhcmS3IGlzILdhYnNlbnS3LAotCQkqIHRoZW4gdGhlILdiYXNlIHdpbGRjYXJkty4iCisJCSogKDMuMi4yLjEuMSkgIklmIHRoZSDvv71jb21wbGV0ZSB3aWxkY2FyZO+/vSBpcyDvv71hYnNlbnTvv70sCisJCSogdGhlbiB0aGUg77+9YmFzZSB3aWxkY2FyZO+/vS4iCiAJCSovCiAJCXR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkID0gYmFzZVR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkOwotCSAgICB9CSAKKwkgICAgfQogCX0gZWxzZSB7CiAJICAgIC8qCi0JICAgICogKDMuMi4yLjIpICJvdGhlcndpc2UgKHRoZSC3YmFzZSB3aWxkY2FyZLcgaXMgt2Fic2VudLcpIHRoZQotCSAgICAqILdjb21wbGV0ZSB3aWxkY2FyZCIKKwkgICAgKiAoMy4yLjIuMikgIm90aGVyd2lzZSAodGhlIO+/vWJhc2Ugd2lsZGNhcmTvv70gaXMg77+9YWJzZW5077+9KSB0aGUKKwkgICAgKiDvv71jb21wbGV0ZSB3aWxkY2FyZCIKIAkgICAgKiBOT09QCiAJICAgICovCiAJfQpAQCAtMTQ0ODYsMTEgKzE0NDg2LDExIEBACiAJLyoKIAkqIFNQRUMge2F0dHJpYnV0ZSB3aWxkY2FyZH0KIAkqICgzLjEpICJJZiB0aGUgPHJlc3RyaWN0aW9uPiBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4sIHRoZW4gdGhlCi0JKiC3Y29tcGxldGUgd2lsZGNhcmS3OyIKKwkqIO+/vWNvbXBsZXRlIHdpbGRjYXJk77+9OyIKIAkqIE5PT1AKIAkqLwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiAoMCk7CiAKIGV4aXRfZmFpbHVyZToKQEAgLTE0NTk0LDYgKzE0NTk0LDcgQEAKICAgICB9CiB9CiAKKyNpZiAwCiAvKioKICAqIHhtbFNjaGVtYUdldFBhcnRpY2xlVG90YWxSYW5nZU1heDoKICAqIEBwYXJ0aWNsZTogdGhlIHBhcnRpY2xlCkBAIC0xNDY1Myw2ICsxNDY1NCw3IEBACiAJcmV0dXJuIChwYXJ0aWNsZS0+bWF4T2NjdXJzICogc3VtKTsKICAgICB9CiB9CisjZW5kaWYKIAogLyoqCiAgKiB4bWxTY2hlbWFJc1BhcnRpY2xlRW1wdGlhYmxlOgpAQCAtMTQ3MzMsMTIgKzE0NzM1LDEyIEBACiAgICAgLyogMi4yICovCiAgICAgaWYgKHR5cGUtPmJhc2VUeXBlID09IGJhc2VUeXBlKSB7CiAJLyoKLQkqIDIuMi4xIEQncyC3YmFzZSB0eXBlIGRlZmluaXRpb263IGlzIEIuCisJKiAyLjIuMSBEJ3Mg77+9YmFzZSB0eXBlIGRlZmluaXRpb27vv70gaXMgQi4KIAkqLwogCXJldHVybiAoMCk7CiAgICAgfQogICAgIC8qCi0gICAgKiAyLjIuMiBEJ3Mgt2Jhc2UgdHlwZSBkZWZpbml0aW9utyBpcyBub3QgdGhlILd1ci10eXBlIGRlZmluaXRpb263CisgICAgKiAyLjIuMiBEJ3Mg77+9YmFzZSB0eXBlIGRlZmluaXRpb27vv70gaXMgbm90IHRoZSDvv711ci10eXBlIGRlZmluaXRpb27vv70KICAgICAqIGFuZCBpcyB2YWxpZGx5IGRlcml2ZWQgZnJvbSBCIGdpdmVuIHRoZSBzdWJzZXQsIGFzIGRlZmluZWQgYnkgdGhpcwogICAgICogY29uc3RyYWludC4KICAgICAqLwpAQCAtMTQ3NDgsOCArMTQ3NTAsOCBAQAogCXJldHVybiAoMCk7CiAgICAgfQogICAgIC8qCi0gICAgKiAyLjIuMyBEJ3Mge3ZhcmlldHl9IGlzIGxpc3Qgb3IgdW5pb24gYW5kIEIgaXMgdGhlILdzaW1wbGUgdXItdHlwZQotICAgICogZGVmaW5pdGlvbrcuCisgICAgKiAyLjIuMyBEJ3Mge3ZhcmlldHl9IGlzIGxpc3Qgb3IgdW5pb24gYW5kIEIgaXMgdGhlIO+/vXNpbXBsZSB1ci10eXBlCisgICAgKiBkZWZpbml0aW9u77+9LgogICAgICovCiAgICAgaWYgKFdYU19JU19BTllfU0lNUExFX1RZUEUoYmFzZVR5cGUpICYmCiAJKFdYU19JU19MSVNUKHR5cGUpIHx8IFdYU19JU19VTklPTih0eXBlKSkpIHsKQEAgLTE0ODY1LDEwICsxNDg2NywxMCBAQAogeG1sU2NoZW1hQ2hlY2tVbmlvblR5cGVEZWZDaXJjdWxhclJlY3VyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgcGN0eHQsCiAJCQkJCXhtbFNjaGVtYVR5cGVQdHIgY3R4VHlwZSwKIAkJCQkJeG1sU2NoZW1hVHlwZUxpbmtQdHIgbWVtYmVycykKLXsgICAgCit7CiAgICAgeG1sU2NoZW1hVHlwZUxpbmtQdHIgbWVtYmVyOwogICAgIHhtbFNjaGVtYVR5cGVQdHIgbWVtYmVyVHlwZTsKLSAgICAKKwogICAgIG1lbWJlciA9IG1lbWJlcnM7CiAgICAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKSB7CiAJbWVtYmVyVHlwZSA9IG1lbWJlci0+dHlwZTsKQEAgLTE0OTY5LDcgKzE0OTcxLDcgQEAKIAkgICAgfQogCSAgICByZXR1cm47CiAJfQotICAgIH0gCisgICAgfQogICAgIC8qCiAgICAgKiBUaGUgYmFsbCBvZiBsZXR0ZXJzIGJlbG93IG1lYW5zLCB0aGF0IGlmIHdlIGhhdmUgYSBwYXJ0aWNsZQogICAgICogd2hpY2ggaGFzIGEgUU5hbWUtaGVscGVyIGNvbXBvbmVudCBhcyBpdHMge3Rlcm19LCB3ZSB3YW50CkBAIC0xNTAxMiw3ICsxNTAxNCw3IEBACiAJICAgICogcGFydGljbGUncyB7dGVybX0uCiAJICAgICovCiAJICAgIFdYU19UWVBFX1BBUlRJQ0xFX1RFUk0odHlwZURlZikgPSBXWFNfTU9ERUxHUk9VUERFRl9NT0RFTChncm91cERlZik7Ci0JICAgIAorCiAJICAgIGlmIChXWFNfTU9ERUxHUk9VUERFRl9NT0RFTChncm91cERlZiktPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0FMTCkgewogCQkvKgogCQkqIFNQRUMgY29zLWFsbC1saW1pdGVkICgxLjIpCkBAIC0xNTA2MSwxNCArMTUwNjMsMTQgQEAKICAgICAqIE5PVEU6IFRoaXMgaXMgc29tZWhvdyByZWR1bmRhbnQsIHNpbmNlIHdlIGFjdHVhbGx5IGJ1aWx0IGEgc2ltcGxlIHR5cGUKICAgICAqIHRvIGhhdmUgYWxsIHRoZSBuZWVkZWQgaW5mb3JtYXRpb247IHRoaXMgYWN0cyBhcyBhbiBzZWxmIHRlc3QuCiAgICAgKi8KLSAgICAvKiBCYXNlIHR5cGU6IElmIHRoZSBkYXRhdHlwZSBoYXMgYmVlbiC3ZGVyaXZlZLcgYnkgt3Jlc3RyaWN0aW9utwotICAgICogdGhlbiB0aGUgU2ltcGxlIFR5cGUgRGVmaW5pdGlvbiBjb21wb25lbnQgZnJvbSB3aGljaCBpdCBpcyC3ZGVyaXZlZLcsCi0gICAgKiBvdGhlcndpc2UgdGhlIFNpbXBsZSBUeXBlIERlZmluaXRpb24gZm9yIGFueVNpbXBsZVR5cGUgKKc0LjEuNikuCisgICAgLyogQmFzZSB0eXBlOiBJZiB0aGUgZGF0YXR5cGUgaGFzIGJlZW4g77+9ZGVyaXZlZO+/vSBieSDvv71yZXN0cmljdGlvbu+/vQorICAgICogdGhlbiB0aGUgU2ltcGxlIFR5cGUgRGVmaW5pdGlvbiBjb21wb25lbnQgZnJvbSB3aGljaCBpdCBpcyDvv71kZXJpdmVk77+9LAorICAgICogb3RoZXJ3aXNlIHRoZSBTaW1wbGUgVHlwZSBEZWZpbml0aW9uIGZvciBhbnlTaW1wbGVUeXBlICjvv700LjEuNikuCiAgICAgKi8KICAgICBpZiAoYmFzZVR5cGUgPT0gTlVMTCkgewogCS8qCiAJKiBUT0RPOiBUaGluayBhYm91dDogIm1vZHVsbyB0aGUgaW1wYWN0IG9mIE1pc3NpbmcKLQkqIFN1Yi1jb21wb25lbnRzICinNS4zKS4iCisJKiBTdWItY29tcG9uZW50cyAo77+9NS4zKS4iCiAJKi8KIAl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSwKQEAgLTE1MDkyLDcgKzE1MDk0LDcgQEAKIAl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSwKIAkgICAgV1hTX0JBU0lDX0NBU1QgdHlwZSwgTlVMTCwKLQkgICAgIkEgdHlwZSwgZGVyaXZlZCBieSBsaXN0IG9yIHVuaW9uLCBtdXN0IGhhdmUiCisJICAgICJBIHR5cGUsIGRlcml2ZWQgYnkgbGlzdCBvciB1bmlvbiwgbXVzdCBoYXZlICIKIAkgICAgInRoZSBzaW1wbGUgdXItdHlwZSBkZWZpbml0aW9uIGFzIGJhc2UgdHlwZSwgbm90ICclcyciLAogCSAgICB4bWxTY2hlbWFHZXRDb21wb25lbnRRTmFtZSgmc3RyLCBiYXNlVHlwZSkpOwogCUZSRUVfQU5EX05VTEwoc3RyKQpAQCAtMTUxMjcsMTAgKzE1MTI5LDEwIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAqIDIgQWxsIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zIG11c3QgYmUgZGVyaXZlZCB1bHRpbWF0ZWx5IGZyb20gdGhlILdzaW1wbGUKLSAgICAqIHVyLXR5cGUgZGVmaW5pdGlvbiAoc2+3IGNpcmN1bGFyIGRlZmluaXRpb25zIGFyZSBkaXNhbGxvd2VkKS4gVGhhdCBpcywgaXQKLSAgICAqIG11c3QgYmUgcG9zc2libGUgdG8gcmVhY2ggYSBidWlsdC1pbiBwcmltaXRpdmUgZGF0YXR5cGUgb3IgdGhlILdzaW1wbGUKLSAgICAqIHVyLXR5cGUgZGVmaW5pdGlvbrcgYnkgcmVwZWF0ZWRseSBmb2xsb3dpbmcgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0uCisgICAgKiAyIEFsbCBzaW1wbGUgdHlwZSBkZWZpbml0aW9ucyBtdXN0IGJlIGRlcml2ZWQgdWx0aW1hdGVseSBmcm9tIHRoZSDvv71zaW1wbGUKKyAgICAqIHVyLXR5cGUgZGVmaW5pdGlvbiAoc2/vv70gY2lyY3VsYXIgZGVmaW5pdGlvbnMgYXJlIGRpc2FsbG93ZWQpLiBUaGF0IGlzLCBpdAorICAgICogbXVzdCBiZSBwb3NzaWJsZSB0byByZWFjaCBhIGJ1aWx0LWluIHByaW1pdGl2ZSBkYXRhdHlwZSBvciB0aGUg77+9c2ltcGxlCisgICAgKiB1ci10eXBlIGRlZmluaXRpb27vv70gYnkgcmVwZWF0ZWRseSBmb2xsb3dpbmcgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0uCiAgICAgKgogICAgICogTk9URTogdGhpcyBpcyBkb25lIGluIHhtbFNjaGVtYUNoZWNrVHlwZURlZkNpcmN1bGFyKCkuCiAgICAgKi8KQEAgLTE1MzE0LDEwICsxNTMxNiwxMCBAQAogCSAgICB9CiAJICAgIC8qCiAJICAgICogTUFZQkUgVE9ETzogKEhtbSwgbm90IHJlYWxseSkgRGF0YXR5cGVzIHN0YXRlczoKLQkgICAgKiBBILdsaXN0tyBkYXRhdHlwZSBjYW4gYmUgt2Rlcml2ZWS3IGZyb20gYW4gt2F0b21pY7cgZGF0YXR5cGUKLQkgICAgKiB3aG9zZSC3bGV4aWNhbCBzcGFjZbcgYWxsb3dzIHNwYWNlIChzdWNoIGFzIHN0cmluZyBvciBhbnlVUkkpb3IKLQkgICAgKiBhILd1bmlvbrcgZGF0YXR5cGUgYW55IG9mIHdob3NlIHttZW1iZXIgdHlwZSBkZWZpbml0aW9uc30ncwotCSAgICAqILdsZXhpY2FsIHNwYWNltyBhbGxvd3Mgc3BhY2UuCisJICAgICogQSDvv71saXN077+9IGRhdGF0eXBlIGNhbiBiZSDvv71kZXJpdmVk77+9IGZyb20gYW4g77+9YXRvbWlj77+9IGRhdGF0eXBlCisJICAgICogd2hvc2Ug77+9bGV4aWNhbCBzcGFjZe+/vSBhbGxvd3Mgc3BhY2UgKHN1Y2ggYXMgc3RyaW5nIG9yIGFueVVSSSlvcgorCSAgICAqIGEg77+9dW5pb27vv70gZGF0YXR5cGUgYW55IG9mIHdob3NlIHttZW1iZXIgdHlwZSBkZWZpbml0aW9uc30ncworCSAgICAqIO+/vWxleGljYWwgc3BhY2Xvv70gYWxsb3dzIHNwYWNlLgogCSAgICAqLwogCX0gZWxzZSB7CiAJICAgIC8qCkBAIC0xNTM1NCw3ICsxNTM1Niw3IEBACiAJICAgIC8qCiAJICAgICogMi4zLjIuMyBUaGUge2l0ZW0gdHlwZSBkZWZpbml0aW9ufSBtdXN0IGJlIHZhbGlkbHkgZGVyaXZlZAogCSAgICAqIGZyb20gdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0ncyB7aXRlbSB0eXBlIGRlZmluaXRpb259IGdpdmVuCi0JICAgICogdGhlIGVtcHR5IHNldCwgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpLgorCSAgICAqIHRoZSBlbXB0eSBzZXQsIGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICjvv70zLjE0LjYpLgogCSAgICAqLwogCSAgICB7CiAJCXhtbFNjaGVtYVR5cGVQdHIgYmFzZUl0ZW1UeXBlOwpAQCAtMTU0MDEsNyArMTU0MDMsNyBAQAogCQkJY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0U6CiAJCQkgICAgLyoKIAkJCSAgICAqIFRPRE86IDIuNS4xLjIgTGlzdCBkYXRhdHlwZXMKLQkJCSAgICAqIFRoZSB2YWx1ZSBvZiC3d2hpdGVTcGFjZbcgaXMgZml4ZWQgdG8gdGhlIHZhbHVlIGNvbGxhcHNlLgorCQkJICAgICogVGhlIHZhbHVlIG9mIO+/vXdoaXRlU3BhY2Xvv70gaXMgZml4ZWQgdG8gdGhlIHZhbHVlIGNvbGxhcHNlLgogCQkJICAgICovCiAJCQljYXNlIFhNTF9TQ0hFTUFfRkFDRVRfUEFUVEVSTjoKIAkJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9FTlVNRVJBVElPTjoKQEAgLTE1NDU0LDggKzE1NDU2LDggQEAKIAkgICAgbWVtYmVyID0gbWVtYmVyLT5uZXh0OwogCX0KIAkvKgotCSogMy4zLjEgSWYgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgdGhlILdzaW1wbGUgdXItdHlwZQotCSogZGVmaW5pdGlvbrcKKwkqIDMuMy4xIElmIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIHRoZSDvv71zaW1wbGUgdXItdHlwZQorCSogZGVmaW5pdGlvbu+/vQogCSovCiAJaWYgKHR5cGUtPmJhc2VUeXBlLT5idWlsdEluVHlwZSA9PSBYTUxfU0NIRU1BU19BTllTSU1QTEVUWVBFKSB7CiAJICAgIC8qCkBAIC0xNTUxNyw3ICsxNTUxOSw3IEBACiAJICAgICogMy4zLjIuMyBUaGUge21lbWJlciB0eXBlIGRlZmluaXRpb25zfSwgaW4gb3JkZXIsIG11c3QgYmUgdmFsaWRseQogCSAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGRlZmluaXRpb25zIGluIHRoZSB7YmFzZQogCSAgICAqIHR5cGUgZGVmaW5pdGlvbn0ncyB7bWVtYmVyIHR5cGUgZGVmaW5pdGlvbnN9IGdpdmVuIHRoZSBlbXB0eSBzZXQsCi0JICAgICogYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpLgorCSAgICAqIGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICjvv70zLjE0LjYpLgogCSAgICAqLwogCSAgICB7CiAJCXhtbFNjaGVtYVR5cGVMaW5rUHRyIGJhc2VNZW1iZXI7CkBAIC0xNTYwOSw3ICsxNTYxMSw3IEBACiAgKiBAY3R4dDogIHRoZSBzY2hlbWEgcGFyc2VyIGNvbnRleHQKICAqIEB0eXBlOiAgdGhlIHNpbXBsZSB0eXBlIGRlZmluaXRpb24KICAqCi0gKiBDaGVja3MgY3JjLXNpbXBsZS10eXBlIGNvbnN0cmFpbnRzLiAKKyAqIENoZWNrcyBjcmMtc2ltcGxlLXR5cGUgY29uc3RyYWludHMuCiAgKgogICogUmV0dXJucyAwIGlmIHRoZSBjb25zdHJhaW50cyBhcmUgc2F0aXNmaWVkLAogICogaWYgbm90IGEgcG9zaXRpdmUgZXJyb3IgY29kZSBhbmQgLTEgb24gaW50ZXJuYWwKQEAgLTE1NjIzLDggKzE1NjI1LDggQEAKICAgICAvKgogICAgICogc3JjLXNpbXBsZS10eXBlLjEgVGhlIGNvcnJlc3BvbmRpbmcgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgaWYgYW55LAogICAgICogbXVzdCBzYXRpc2Z5IHRoZSBjb25kaXRpb25zIHNldCBvdXQgaW4gQ29uc3RyYWludHMgb24gU2ltcGxlIFR5cGUKLSAgICAqIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudHMgKKczLjE0LjYpLgotICAgICovICAgIAorICAgICogRGVmaW5pdGlvbiBTY2hlbWEgQ29tcG9uZW50cyAo77+9My4xNC42KS4KKyAgICAqLwogICAgIGlmIChXWFNfSVNfUkVTVFJJQ1RJT04odHlwZSkpIHsKIAkvKgogCSogc3JjLXNpbXBsZS10eXBlLjIgIklmIHRoZSA8cmVzdHJpY3Rpb24+IGFsdGVybmF0aXZlIGlzIGNob3NlbiwKQEAgLTE1NjMzLDcgKzE1NjM1LDcgQEAKIAkqIE5PVEU6IFRoaXMgaXMgY2hlY2tlZCBpbiB0aGUgcGFyc2UgZnVuY3Rpb24gb2YgPHJlc3RyaWN0aW9uPi4KIAkqLwogCS8qCi0JKiAKKwkqCiAJKi8KICAgICB9IGVsc2UgaWYgKFdYU19JU19MSVNUKHR5cGUpKSB7CiAJLyogc3JjLXNpbXBsZS10eXBlLjMgIklmIHRoZSA8bGlzdD4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLCBlaXRoZXIgaXQgbXVzdCBoYXZlCkBAIC0xNTY0Miw4ICsxNTY0NCw4IEBACiAJKgogCSogTk9URTogVGhpcyBpcyBjaGVja2VkIGluIHRoZSBwYXJzZSBmdW5jdGlvbiBvZiA8bGlzdD4uCiAJKi8KLSAgICB9IGVsc2UgaWYgKFdYU19JU19VTklPTih0eXBlKSkgewkKLQkvKiAKKyAgICB9IGVsc2UgaWYgKFdYU19JU19VTklPTih0eXBlKSkgeworCS8qCiAJKiBzcmMtc2ltcGxlLXR5cGUuNCBpcyBjaGVja2VkIGluIHhtbFNjaGVtYUNoZWNrVW5pb25UeXBlRGVmQ2lyY3VsYXIoKS4KIAkqLwogICAgIH0KQEAgLTE1NzIxLDggKzE1NzIzLDggQEAKIAkqIFNQRUMgKDIuMSkgIml0cyB7Y29udGVudCB0eXBlfSBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbgogCSogb3IgbWl4ZWQuIgogCSogU1BFQyAoMi4yLjIpICJJZiB0aGUge2NvbnRlbnQgdHlwZX0gaXMgbWl4ZWQsIHRoZW4gdGhlIHtjb250ZW50Ci0JKiB0eXBlfSdzIHBhcnRpY2xlIG11c3QgYmUgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBieQotCSogUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLiIKKwkqIHR5cGV9J3MgcGFydGljbGUgbXVzdCBiZSDvv71lbXB0aWFibGXvv70gYXMgZGVmaW5lZCBieQorCSogUGFydGljbGUgRW1wdGlhYmxlICjvv70zLjkuNikuIgogCSovCiAJaWYgKCghIFdYU19IQVNfU0lNUExFX0NPTlRFTlQodHlwZSkpICYmCiAJICAgICgoISBXWFNfSEFTX01JWEVEX0NPTlRFTlQodHlwZSkpIHx8ICghIFdYU19FTVBUSUFCTEUodHlwZSkpKSkgewpAQCAtMTU3MzgsMTQgKzE1NzQwLDE0IEBACiAgICAgfQogICAgIC8qCiAgICAgKiAxIElmIHRoZSB0eXBlIGRlZmluaXRpb24gaXMgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIHRoZSBzdHJpbmcKLSAgICAqIG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QgdG8gdGhhdCBkZWZpbml0aW9uIGFzIGRlZmluZWQgYnkgU3RyaW5nCi0gICAgKiBWYWxpZCAopzMuMTQuNCkuCisgICAgKiBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdCB0byB0aGF0IGRlZmluaXRpb24gYXMgZGVmaW5lZCBieSBTdHJpbmcKKyAgICAqIFZhbGlkICjvv70zLjE0LjQpLgogICAgICoKICAgICAqIEFORAogICAgICoKICAgICAqIDIuMi4xIElmIHRoZSB7Y29udGVudCB0eXBlfSBpcyBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24sIHRoZW4gdGhlCi0gICAgKiBzdHJpbmcgbXVzdCBiZSC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGF0IHNpbXBsZSB0eXBlIGRlZmluaXRpb24KLSAgICAqIGFzIGRlZmluZWQgYnkgU3RyaW5nIFZhbGlkICinMy4xNC40KS4KKyAgICAqIHN0cmluZyBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdCB0byB0aGF0IHNpbXBsZSB0eXBlIGRlZmluaXRpb24KKyAgICAqIGFzIGRlZmluZWQgYnkgU3RyaW5nIFZhbGlkICjvv70zLjE0LjQpLgogICAgICovCiAgICAgaWYgKFdYU19JU19TSU1QTEUodHlwZSkpCiAJcmV0ID0geG1sU2NoZW1hVkNoZWNrQ1ZDU2ltcGxlVHlwZShBQ1RYVF9DQVNUIHBjdHh0LCBub2RlLApAQCAtMTU3ODYsOCArMTU3ODgsOCBAQAogICAgICoKICAgICAqIFNQRUMgKDEpICJUaGUgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24gbXVzdAogICAgICogYmUgYXMgZGVzY3JpYmVkIGluIHRoZSBwcm9wZXJ0eSB0YWJsZWF1IGluIFRoZSBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbgotICAgICogU2NoZW1hIENvbXBvbmVudCAopzMuNC4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YgTWlzc2luZwotICAgICogU3ViLWNvbXBvbmVudHMgKKc1LjMpLiIKKyAgICAqIFNjaGVtYSBDb21wb25lbnQgKO+/vTMuNC4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YgTWlzc2luZworICAgICogU3ViLWNvbXBvbmVudHMgKO+/vTUuMykuIgogICAgICovCiAgICAgaWYgKCh0eXBlLT5iYXNlVHlwZSAhPSBOVUxMKSAmJgogCShXWFNfSVNfU0lNUExFKHR5cGUtPmJhc2VUeXBlKSkgJiYKQEAgLTE1Nzk4LDE0ICsxNTgwMCwxNCBAQAogCSovCiAJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgcGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NSQ19DVF8xLAotCSAgICBOVUxMLCBXWFNfQkFTSUNfQ0FTVCB0eXBlLCAKKwkgICAgTlVMTCwgV1hTX0JBU0lDX0NBU1QgdHlwZSwKIAkgICAgIklmIHRoZSBiYXNlIHR5cGUgaXMgYSBzaW1wbGUgdHlwZSwgdGhlIGRlcml2YXRpb24gbWV0aG9kIG11c3QgYmUgIgogCSAgICAiJ2V4dGVuc2lvbiciLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gKFhNTF9TQ0hFTUFQX1NSQ19DVF8xKTsKICAgICB9CiAgICAgLyoKLSAgICAqIFNQRUMgKDMpICJDaXJjdWxhciBkZWZpbml0aW9ucyBhcmUgZGlzYWxsb3dlZCwgZXhjZXB0IGZvciB0aGUgt3VyLXR5cGUKLSAgICAqIGRlZmluaXRpb263LiBUaGF0IGlzLCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlYWNoIHRoZSC3dXItdHlwZQorICAgICogU1BFQyAoMykgIkNpcmN1bGFyIGRlZmluaXRpb25zIGFyZSBkaXNhbGxvd2VkLCBleGNlcHQgZm9yIHRoZSDvv711ci10eXBlCisgICAgKiBkZWZpbml0aW9u77+9LiBUaGF0IGlzLCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlYWNoIHRoZSDvv711ci10eXBlCiAgICAgKiBkZWZpbml0aW9uIGJ5IHJlcGVhdGVkbHkgZm9sbG93aW5nIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259LiIKICAgICAqCiAgICAgKiBOT1RFICgzKSBpcyBkb25lIGluIHhtbFNjaGVtYUNoZWNrVHlwZURlZkNpcmN1bGFyKCkuCkBAIC0xNTgxNSw3ICsxNTgxNyw3IEBACiAgICAgKiAgIC0gYXR0cmlidXRlIHVzZXMgbmVlZCB0byBiZSBhbHJlYWR5IGluaGVyaXRlZCAoYXBwbHkgYXR0ci4gcHJvaGliaXRpb25zKQogICAgICogICAtIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2VzIG5lZWQgdG8gYmUgZXhwYW5kZWQgYWxyZWFkeQogICAgICogICAtIHNpbXBsZSB0eXBlcyBuZWVkIHRvIGJlIHR5cGVmaXhlZCBhbHJlYWR5Ci0gICAgKi8gICAgCisgICAgKi8KICAgICBpZiAodHlwZS0+YXR0clVzZXMgJiYKIAkoKCh4bWxTY2hlbWFJdGVtTGlzdFB0cikgdHlwZS0+YXR0clVzZXMpLT5uYkl0ZW1zID4gMSkpCiAgICAgewpAQCAtMTU4MjUsOCArMTU4MjcsOCBAQAogCiAJZm9yIChpID0gdXNlcy0+bmJJdGVtcyAtMTsgaSA+PSAwOyBpLS0pIHsKIAkgICAgdXNlID0gdXNlcy0+aXRlbXNbaV07Ci0JICAgIAotCSAgICAvKiAKKworCSAgICAvKgogCSAgICAqIFNQRUMgY3QtcHJvcHMtY29ycmVjdAogCSAgICAqICg0KSAiVHdvIGRpc3RpbmN0IGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gdGhlCiAJICAgICoge2F0dHJpYnV0ZSB1c2VzfSBtdXN0IG5vdCBoYXZlIGlkZW50aWNhbCB7bmFtZX1zIGFuZApAQCAtMTU4NjcsMTAgKzE1ODY5LDEwIEBACiAJICAgIGlmIChXWFNfQVRUUlVTRV9UWVBFREVGKHVzZSkgIT0gTlVMTCkgewogCQlpZiAoeG1sU2NoZW1hSXNEZXJpdmVkRnJvbUJ1aWx0SW5UeXBlKAogCQkgICAgV1hTX0FUVFJVU0VfVFlQRURFRih1c2UpLCBYTUxfU0NIRU1BU19JRCkpCi0JCXsJCQorCQl7CiAJCSAgICBpZiAoaGFzSWQpIHsKIAkJCXhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JCQkKKwogCQkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgcGN0eHQsCiAJCQkgICAgWE1MX1NDSEVNQVBfQUdfUFJPUFNfQ09SUkVDVCwKIAkJCSAgICBOVUxMLCBXWFNfQkFTSUNfQ0FTVCB0eXBlLApAQCAtMTU4ODQsNyArMTU4ODYsNyBAQAogCQkJaWYgKHhtbFNjaGVtYUl0ZW1MaXN0UmVtb3ZlKHVzZXMsIGkpID09IC0xKQogCQkJICAgIGdvdG8gZXhpdF9mYWlsdXJlOwogCQkgICAgfQotCQkgICAgCisKIAkJICAgIGhhc0lkID0gMTsKIAkJfQogCSAgICB9CkBAIC0xNTk1OCw4ICsxNTk2MCw4IEBACiAgICAgaWYgKHR5cGUtPmJhc2VUeXBlID09IGJhc2VUeXBlKQogCXJldHVybiAoMCk7CiAgICAgLyoKLSAgICAqIFNQRUMgKDIuMy4xKSAiRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBub3QgYmUgdGhlILd1ci10eXBlCi0gICAgKiBkZWZpbml0aW9uty4iCisgICAgKiBTUEVDICgyLjMuMSkgIkQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3Qgbm90IGJlIHRoZSDvv711ci10eXBlCisgICAgKiBkZWZpbml0aW9u77+9LiIKICAgICAqLwogICAgIGlmIChXWFNfSVNfQU5ZVFlQRSh0eXBlLT5iYXNlVHlwZSkpCiAJcmV0dXJuICgxKTsKQEAgLTE1OTc2LDcgKzE1OTc4LDcgQEAKIAkvKgogCSogU1BFQyAoMi4zLjIuMikgIklmIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIHNpbXBsZSwgdGhlbiBpdAogCSogbXVzdCBiZSB2YWxpZGx5IGRlcml2ZWQgZnJvbSBCIGdpdmVuIHRoZSBzdWJzZXQgYXMgZGVmaW5lZCBpbiBUeXBlCi0JKiBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICinMy4xNC42KS4KKwkqIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKO+/vTMuMTQuNikuCiAJKi8KIAlyZXR1cm4gKHhtbFNjaGVtYUNoZWNrQ09TU1REZXJpdmVkT0soYWN0eHQsIHR5cGUtPmJhc2VUeXBlLAogCSAgICBiYXNlVHlwZSwgc2V0KSk7CkBAIC0xNjAzNyw3ICsxNjAzOSw3IEBACiAgICAgKiBTUEVDICgxKSAiSWYgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiwKICAgICAqIHRoZW4gYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiIKICAgICAqLwotICAgIGlmIChXWFNfSVNfQ09NUExFWChiYXNlKSkgewkKKyAgICBpZiAoV1hTX0lTX0NPTVBMRVgoYmFzZSkpIHsKIAkvKgogCSogU1BFQyAoMS4xKSAiVGhlIHtmaW5hbH0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBub3QKIAkqIGNvbnRhaW4gZXh0ZW5zaW9uLiIKQEAgLTE2MDUwLDcgKzE2MDUyLDcgQEAKIAkJImNvbnRhaW5zICdleHRlbnNpb24nIiwgTlVMTCk7CiAJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfQ09TX0NUX0VYVEVORFNfMV8xKTsKIAl9Ci0JCisKIAkvKgogCSogQVRURU5USU9OOiBUaGUgY29uc3RyYWlucyAoMS4yKSBhbmQgKDEuMykgYXJlIG5vdCBhcHBsaWVkLAogCSogc2luY2UgdGhleSBhcmUgYXV0b21hdGljYWxseSBzYXRpc2ZpZWQgdGhyb3VnaCB0aGUKQEAgLTE2MDk0LDExICsxNjA5NiwxMSBAQAogCQl9CiAJCWlmICghIGZvdW5kKSB7CiAJCSAgICB4bWxDaGFyICpzdHIgPSBOVUxMOwotCQkKKwogCQkgICAgeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgY3R4dCwKIAkJCVhNTF9TQ0hFTUFQX0NPU19DVF9FWFRFTkRTXzFfMiwKIAkJCU5VTEwsIFdYU19CQVNJQ19DQVNUIHR5cGUsCi0JCQkvKiAKKwkJCS8qCiAJCQkqIFRPRE86IFRoZSByZXBvcnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhbHNvIHRoZQogCQkJKiB0eXBlIG5lZWRzIHRvIGJlIHRoZSBzYW1lLgogCQkJKi8KQEAgLTE2MTE2LDkgKzE2MTE4LDkgQEAKIAkqIGRlZmluaXRpb24gbXVzdCBhbHNvIGhhdmUgb25lLCBhbmQgdGhlIGJhc2UgdHlwZSBkZWZpbml0aW9uJ3MKIAkqIHthdHRyaWJ1dGUgIHdpbGRjYXJkfSdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0gbXVzdCBiZSBhIHN1YnNldAogCSogb2YgdGhlIGNvbXBsZXggIHR5cGUgZGVmaW5pdGlvbidzIHthdHRyaWJ1dGUgd2lsZGNhcmR9J3Mge25hbWVzcGFjZQotCSogY29uc3RyYWludH0sIGFzIGRlZmluZWQgYnkgV2lsZGNhcmQgU3Vic2V0ICinMy4xMC42KS4iCisJKiBjb25zdHJhaW50fSwgYXMgZGVmaW5lZCBieSBXaWxkY2FyZCBTdWJzZXQgKO+/vTMuMTAuNikuIgogCSovCi0gIAorCiAJLyoKIAkqIE1BWUJFIFRPRE86IEVuYWJsZSBpZiBldmVyIG5lZWRlZC4gQnV0IHRoaXMgd2lsbCBiZSBuZWVkZWQgb25seQogCSogaWYgY3JlYXRlZCB0aGUgdHlwZSB2aWEgYSBzY2hlbWEgY29uc3RydWN0aW9uIEFQSS4KQEAgLTE2MTI2LDcgKzE2MTI4LDcgQEAKIAlpZiAoYmFzZS0+YXR0cmlidXRlV2lsZGNhcmQgIT0gTlVMTCkgewogCSAgICBpZiAodHlwZS0+YXR0cmlidXRlV2lsY2FyZCA9PSBOVUxMKSB7CiAJCXhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JCQorCiAJCXhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIHBjdHh0LAogCQkgICAgWE1MX1NDSEVNQVBfQ09TX0NUX0VYVEVORFNfMV8zLAogCQkgICAgTlVMTCwgdHlwZSwKQEAgLTE2MTM5LDcgKzE2MTQxLDcgQEAKIAkJYmFzZS0+YXR0cmlidXRlV2lsZGNhcmQsIHR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkKSkKIAkgICAgewogCQl4bWxDaGFyICpzdHIgPSBOVUxMOwotCQkKKwogCQl4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJICAgIFhNTF9TQ0hFTUFQX0NPU19DVF9FWFRFTkRTXzFfMywKIAkJICAgIE5VTEwsIHR5cGUsCkBAIC0xNjIxMyw5ICsxNjIxNSw5IEBACiAJCX0KIAkJLyoKIAkJKiBVUkdFTlQgVE9ETyBTUEVDICgxLjQuMy4yLjIuMikgIlRoZSBwYXJ0aWNsZSBvZiB0aGUKLQkJKiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBtdXN0IGJlIGEgt3ZhbGlkIGV4dGVuc2lvbrcKKwkJKiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBtdXN0IGJlIGEg77+9dmFsaWQgZXh0ZW5zaW9u77+9CiAJCSogb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0ncyBwYXJ0aWNsZSwgYXMgZGVmaW5lZAotCQkqIGluIFBhcnRpY2xlIFZhbGlkIChFeHRlbnNpb24pICinMy45LjYpLiIKKwkJKiBpbiBQYXJ0aWNsZSBWYWxpZCAoRXh0ZW5zaW9uKSAo77+9My45LjYpLiIKIAkJKgogCQkqIE5PVEUgdGhhdCB3ZSB3b24ndCBjaGVjayAiUGFydGljbGUgVmFsaWQgKEV4dGVuc2lvbikiLAogCQkqIHNpbmNlIGl0IGlzIGVuc3VyZWQgYnkgdGhlIGRlcml2YXRpb24gcHJvY2VzcyBpbgpAQCAtMTYyOTMsNyArMTYyOTUsNyBAQAogICAgICovCiAgICAgYmFzZSA9IHR5cGUtPmJhc2VUeXBlOwogICAgIGlmICghIFdYU19JU19DT01QTEVYKGJhc2UpKSB7Ci0JeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgY3R4dCwJICAgIAorCXhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMSwKIAkgICAgdHlwZS0+bm9kZSwgV1hTX0JBU0lDX0NBU1QgdHlwZSwKIAkgICAgIlRoZSBiYXNlIHR5cGUgbXVzdCBiZSBhIGNvbXBsZXggdHlwZSIsIE5VTEwsIE5VTEwpOwpAQCAtMTYzMDQsNyArMTYzMDYsNyBAQAogCSogU1BFQyAoMSkgIlRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgYSBjb21wbGV4IHR5cGUKIAkqIGRlZmluaXRpb24gd2hvc2Uge2ZpbmFsfSBkb2VzIG5vdCBjb250YWluIHJlc3RyaWN0aW9uLiIKIAkqLwotCXhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIGN0eHQsCSAgICAKKwl4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCBjdHh0LAogCSAgICBYTUxfU0NIRU1BUF9ERVJJVkFUSU9OX09LX1JFU1RSSUNUSU9OXzEsCiAJICAgIHR5cGUtPm5vZGUsIFdYU19CQVNJQ19DQVNUIHR5cGUsCiAJICAgICJUaGUgJ2ZpbmFsJyBvZiB0aGUgYmFzZSB0eXBlIGRlZmluaXRpb24gIgpAQCAtMTYzMzIsNyArMTYzMzQsNyBAQAogICAgIGlmIChiYXNlLT5idWlsdEluVHlwZSA9PSBYTUxfU0NIRU1BU19BTllUWVBFKSB7CiAJLyoKIAkqIFNQRUMgKDUuMSkgIlRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYmUgdGhlCi0JKiC3dXItdHlwZSBkZWZpbml0aW9uty4iCisJKiDvv711ci10eXBlIGRlZmluaXRpb27vv70uIgogCSogUEFTUwogCSovCiAgICAgfSBlbHNlIGlmICgodHlwZS0+Y29udGVudFR5cGUgPT0gWE1MX1NDSEVNQV9DT05URU5UX1NJTVBMRSkgfHwKQEAgLTE2MzUxLDExICsxNjM1MywxMSBAQAogCSAgICAqIFNQRUMgKDUuMi4yLjEpICJUaGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUKIAkgICAgKiBkZWZpbml0aW9ufSBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiBmcm9tIHdoaWNoCiAJICAgICogdGhlIHtjb250ZW50IHR5cGV9IGlzIHZhbGlkbHkgZGVyaXZlZCBnaXZlbiB0aGUgZW1wdHkKLQkgICAgKiBzZXQgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpLiIKKwkgICAgKiBzZXQgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKO+/vTMuMTQuNikuIgogCSAgICAqCiAJICAgICogQVRURU5USU9OIFRPRE86IFRoaXMgc2VlbXMgbm90IG5lZWRlZCBpZiB0aGUgdHlwZSBpbXBsaWNpdGVseQogCSAgICAqIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSB0eXBlLgotCSAgICAqIAorCSAgICAqCiAJICAgICovCiAJICAgIGVyciA9IHhtbFNjaGVtYUNoZWNrQ09TU1REZXJpdmVkT0soQUNUWFRfQ0FTVCBjdHh0LAogCQl0eXBlLT5jb250ZW50VHlwZURlZiwgYmFzZS0+Y29udGVudFR5cGVEZWYsIDApOwpAQCAtMTYzODIsOCArMTYzODQsOCBAQAogCQkoeG1sU2NoZW1hUGFydGljbGVQdHIpIGJhc2UtPnN1YnR5cGVzKSkpIHsKIAkgICAgLyoKIAkgICAgKiBTUEVDICg1LjIuMi4yKSAiVGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBtaXhlZAotCSAgICAqIGFuZCBoYXZlIGEgcGFydGljbGUgd2hpY2ggaXMgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBpbgotCSAgICAqIFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4iCisJICAgICogYW5kIGhhdmUgYSBwYXJ0aWNsZSB3aGljaCBpcyDvv71lbXB0aWFibGXvv70gYXMgZGVmaW5lZCBpbgorCSAgICAqIFBhcnRpY2xlIEVtcHRpYWJsZSAo77+9My45LjYpLiIKIAkgICAgKiBQQVNTCiAJICAgICovCiAJfSBlbHNlIHsKQEAgLTE2NDEyLDcgKzE2NDE0LDcgQEAKIAkgICAgLyoKIAkgICAgKiBTUEVDICg1LjMuMi4yKSAiVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlCiAJICAgICogZGVmaW5pdGlvbn0gbXVzdCBiZSBlbGVtZW50T25seSBvciBtaXhlZCBhbmQgaGF2ZSBhIHBhcnRpY2xlCi0JICAgICogd2hpY2ggaXMgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuIgorCSAgICAqIHdoaWNoIGlzIO+/vWVtcHRpYWJsZe+/vSBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIEVtcHRpYWJsZSAo77+9My45LjYpLiIKIAkgICAgKiBQQVNTCiAJICAgICovCiAJfSBlbHNlIHsKQEAgLTE2NDI5LDcgKzE2NDMxLDcgQEAKIAkvKgogCSogU1BFQyAoNS40LjEuMSkgIlRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24KIAkqIGl0c2VsZiBtdXN0IGJlIGVsZW1lbnQtb25seSIKLQkqLwkgCisJKi8KIAlpZiAoV1hTX0hBU19NSVhFRF9DT05URU5UKHR5cGUpICYmICghIFdYU19IQVNfTUlYRURfQ09OVEVOVChiYXNlKSkpIHsKIAkgICAgLyoKIAkgICAgKiBTUEVDICg1LjQuMS4yKSAiVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSBjb21wbGV4IHR5cGUKQEAgLTE2NDQ1LDkgKzE2NDQ3LDkgQEAKIAl9CiAJLyoKIAkqIFNQRUMgKDUuNC4yKSAiVGhlIHBhcnRpY2xlIG9mIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBpdHNlbGYKLQkqIG11c3QgYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBvZiB0aGUge2NvbnRlbnQKKwkqIG11c3QgYmUgYSDvv712YWxpZCByZXN0cmljdGlvbu+/vSBvZiB0aGUgcGFydGljbGUgb2YgdGhlIHtjb250ZW50CiAJKiB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIFZhbGlkCi0JKiAoUmVzdHJpY3Rpb24pICinMy45LjYpLgorCSogKFJlc3RyaWN0aW9uKSAo77+9My45LjYpLgogCSoKIAkqIFVSR0VOVCBUT0RPOiAoNS40LjIpCiAJKi8KQEAgLTE2NTE2LDcgKzE2NTE4LDcgQEAKICAgICBpZiAoISBXWFNfSEFTX1NJTVBMRV9DT05URU5UKHR5cGUpKSB7CiAJLyoKIAkqIDEgSWYgdGhlIDxjb21wbGV4Q29udGVudD4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLCB0aGUgdHlwZSBkZWZpbml0aW9uCi0JKiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXQorCSog77+9cmVzb2x2ZWTvv70gdG8gYnkgdGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXQogCSogbXVzdCBiZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uOwogCSovCiAJaWYgKCEgV1hTX0lTX0NPTVBMRVgoYmFzZSkpIHsKQEAgLTE2NTM2LDcgKzE2NTM4LDcgQEAKIAkqIFNQRUMKIAkqIDIgSWYgdGhlIDxzaW1wbGVDb250ZW50PiBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4sIGFsbCBvZiB0aGUKIAkqIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6Ci0JKiAyLjEgVGhlIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUKKwkqIDIuMSBUaGUgdHlwZSBkZWZpbml0aW9uIO+/vXJlc29sdmVk77+9IHRvIGJ5IHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2YgdGhlCiAJKiBiYXNlIFthdHRyaWJ1dGVdIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJKi8KIAlpZiAoV1hTX0lTX1NJTVBMRShiYXNlKSkgewpAQCAtMTY1ODYsMTEgKzE2NTg4LDExIEBACiAJCWlmICghIHhtbFNjaGVtYUlzUGFydGljbGVFbXB0aWFibGUoCiAJCSAgICAoeG1sU2NoZW1hUGFydGljbGVQdHIpIGJhc2UtPnN1YnR5cGVzKSkgewogCQkgICAgcmV0ID0gWE1MX1NDSEVNQVBfU1JDX0NUXzE7Ci0JCX0gZWxzZSAKKwkJfSBlbHNlCiAJCSAgICAvKgogCQkgICAgKiBBdHRlbnRpb246IGF0IHRoaXMgcG9pbnQgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCBpcyBpbgogCQkgICAgKiAtPmNvbnRlbnRUeXBlRGVmIChwdXQgdGhlcmUgZHVyaW5nIHBhcnNpbmcpLgotCQkgICAgKi8JCSAgICAKKwkJICAgICovCiAJCSAgICBpZiAodHlwZS0+Y29udGVudFR5cGVEZWYgPT0gTlVMTCkgewogCQkgICAgeG1sQ2hhciAqc3RyID0gTlVMTDsKIAkJICAgIC8qCkBAIC0xNjY0MiwxNCArMTY2NDQsMTQgQEAKICAgICAvKgogICAgICogU1BFQyAoMykgIlRoZSBjb3JyZXNwb25kaW5nIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIGNvbXBvbmVudCBtdXN0CiAgICAgKiBzYXRpc2Z5IHRoZSBjb25kaXRpb25zIHNldCBvdXQgaW4gQ29uc3RyYWludHMgb24gQ29tcGxleCBUeXBlCi0gICAgKiBEZWZpbml0aW9uIFNjaGVtYSBDb21wb25lbnRzICinMy40LjYpOyIKKyAgICAqIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudHMgKO+/vTMuNC42KTsiCiAgICAgKiBOT1RFICgzKSB3aWxsIGJlIGRvbmUgaW4geG1sU2NoZW1hVHlwZUZpeHVwKCkuCiAgICAgKi8KICAgICAvKgogICAgICogU1BFQyAoNCkgSWYgY2xhdXNlIDIuMi4xIG9yIGNsYXVzZSAyLjIuMiBpbiB0aGUgY29ycmVzcG9uZGVuY2Ugc3BlY2lmaWNhdGlvbgogICAgICogYWJvdmUgZm9yIHthdHRyaWJ1dGUgd2lsZGNhcmR9IGlzIHNhdGlzZmllZCwgdGhlIGludGVuc2lvbmFsCiAgICAgKiBpbnRlcnNlY3Rpb24gbXVzdCBiZSBleHByZXNzaWJsZSwgYXMgZGVmaW5lZCBpbiBBdHRyaWJ1dGUgV2lsZGNhcmQKLSAgICAqIEludGVyc2VjdGlvbiAopzMuMTAuNikuCisgICAgKiBJbnRlcnNlY3Rpb24gKO+/vTMuMTAuNikuCiAgICAgKiBOT1RFICg0KSBpcyBkb25lIGluIHhtbFNjaGVtYUZpeHVwVHlwZUF0dHJpYnV0ZVVzZXMoKS4KICAgICAqLwogICAgIHJldHVybiAocmV0KTsKQEAgLTE2NzIwLDcgKzE2NzIyLDcgQEAKIAlyZXR1cm4gKDEpOwogICAgIC8qCiAgICAgKiBTUEVDICgyKSAiUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3MKLSAgICAqIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLiIKKyAgICAqIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICjvv70zLjkuNikuIgogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYUNoZWNrUGFydGljbGVSYW5nZU9LKHItPm1pbk9jY3Vycywgci0+bWF4T2NjdXJzLAogCSAgICBiLT5taW5PY2N1cnMsIGItPm1heE9jY3VycykgIT0gMCkKQEAgLTE2ODEyLDE5ICsxNjgxNCwxOSBAQAogewogICAgIC8qIFRPRE86RXJyb3IgY29kZXMgKHJjYXNlLU5TQ29tcGF0KS4gKi8KICAgICAvKgotICAgICogU1BFQyAiRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263CisgICAgKiBTUEVDICJGb3IgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSB0byBiZSBhIO+/vXZhbGlkIHJlc3RyaWN0aW9u77+9CiAgICAgKiBvZiBhIHdpbGRjYXJkIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToiCiAgICAgKgotICAgICogU1BFQyAoMSkgIlRoZSBlbGVtZW50IGRlY2xhcmF0aW9uJ3Mge3RhcmdldCBuYW1lc3BhY2V9IGlzILd2YWxpZLcKKyAgICAqIFNQRUMgKDEpICJUaGUgZWxlbWVudCBkZWNsYXJhdGlvbidzIHt0YXJnZXQgbmFtZXNwYWNlfSBpcyDvv712YWxpZO+/vQogICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSB3aWxkY2FyZCdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0gYXMgZGVmaW5lZCBieQotICAgICogV2lsZGNhcmQgYWxsb3dzIE5hbWVzcGFjZSBOYW1lICinMy4xMC40KS4iCisgICAgKiBXaWxkY2FyZCBhbGxvd3MgTmFtZXNwYWNlIE5hbWUgKO+/vTMuMTAuNCkuIgogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYUNoZWNrQ1ZDV2lsZGNhcmROYW1lc3BhY2UoKHhtbFNjaGVtYVdpbGRjYXJkUHRyKSBiLT5jaGlsZHJlbiwKIAkoKHhtbFNjaGVtYUVsZW1lbnRQdHIpIHItPmNoaWxkcmVuKS0+dGFyZ2V0TmFtZXNwYWNlKSAhPSAwKQogCXJldHVybiAoMSk7CiAgICAgLyoKICAgICAqIFNQRUMgKDIpICJSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncwotICAgICogb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKKczLjkuNikuIgorICAgICogb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UgUmFuZ2UgT0sgKO+/vTMuOS42KS4iCiAgICAgKi8KICAgICBpZiAoeG1sU2NoZW1hQ2hlY2tQYXJ0aWNsZVJhbmdlT0soci0+bWluT2NjdXJzLCByLT5tYXhPY2N1cnMsCiAJICAgIGItPm1pbk9jY3VycywgYi0+bWF4T2NjdXJzKSAhPSAwKQpAQCAtMTY4ODQsMjEgKzE2ODg2LDIxIEBACiAgICAgLyogVE9ETzogRXJyb3IgY29kZXMgKHJjYXNlLU5TU3Vic2V0KS4gKi8KICAgICAvKgogICAgICogU1BFQyAoMSkgIlIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzCi0gICAgKiBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4iCisgICAgKiBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAo77+9My45LjYpLiIKICAgICAqLwogICAgIGlmICh4bWxTY2hlbWFDaGVja1BhcnRpY2xlUmFuZ2VPSyhyLT5taW5PY2N1cnMsIHItPm1heE9jY3VycywKIAkgICAgYi0+bWluT2NjdXJzLCBiLT5tYXhPY2N1cnMpKQogCXJldHVybiAoMSk7CiAgICAgLyoKICAgICAqIFNQRUMgKDIpICJSJ3Mge25hbWVzcGFjZSBjb25zdHJhaW50fSBtdXN0IGJlIGFuIGludGVuc2lvbmFsIHN1YnNldAotICAgICogb2YgQidzIHtuYW1lc3BhY2UgY29uc3RyYWludH0gYXMgZGVmaW5lZCBieSBXaWxkY2FyZCBTdWJzZXQgKKczLjEwLjYpLiIKKyAgICAqIG9mIEIncyB7bmFtZXNwYWNlIGNvbnN0cmFpbnR9IGFzIGRlZmluZWQgYnkgV2lsZGNhcmQgU3Vic2V0ICjvv70zLjEwLjYpLiIKICAgICAqLwogICAgIGlmICh4bWxTY2hlbWFDaGVja0NPU05TU3Vic2V0KCh4bWxTY2hlbWFXaWxkY2FyZFB0cikgci0+Y2hpbGRyZW4sCiAJKHhtbFNjaGVtYVdpbGRjYXJkUHRyKSBiLT5jaGlsZHJlbikpCiAJcmV0dXJuICgxKTsKICAgICAvKgotICAgICogU1BFQyAoMykgIlVubGVzcyBCIGlzIHRoZSBjb250ZW50IG1vZGVsIHdpbGRjYXJkIG9mIHRoZSC3dXItdHlwZQotICAgICogZGVmaW5pdGlvbrcsIFIncyB7cHJvY2VzcyBjb250ZW50c30gbXVzdCBiZSBpZGVudGljYWwgdG8gb3Igc3Ryb25nZXIKKyAgICAqIFNQRUMgKDMpICJVbmxlc3MgQiBpcyB0aGUgY29udGVudCBtb2RlbCB3aWxkY2FyZCBvZiB0aGUg77+9dXItdHlwZQorICAgICogZGVmaW5pdGlvbu+/vSwgUidzIHtwcm9jZXNzIGNvbnRlbnRzfSBtdXN0IGJlIGlkZW50aWNhbCB0byBvciBzdHJvbmdlcgogICAgICogdGhhbiBCJ3Mge3Byb2Nlc3MgY29udGVudHN9LCB3aGVyZSBzdHJpY3QgaXMgc3Ryb25nZXIgdGhhbiBsYXggaXMKICAgICAqIHN0cm9uZ2VyIHRoYW4gc2tpcC4iCiAgICAgKi8KQEAgLTE2OTQ4LDYgKzE2OTUwLDcgQEAKICAgICByZXR1cm4gKDApOwogfQogCisjaWYgMAogLyoqCiAgKiB4bWxTY2hlbWFDaGVja1JDYXNlTlNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eToKICAqIEBjdHh0OiAgdGhlIHNjaGVtYSBwYXJzZXIgY29udGV4dApAQCAtMTY5NzUsMTIgKzE2OTc4LDEyIEBACiAgICAgaWYgKChyLT5jaGlsZHJlbiA9PSBOVUxMKSB8fCAoci0+Y2hpbGRyZW4tPmNoaWxkcmVuID09IE5VTEwpKQogCXJldHVybiAoLTEpOwogICAgIC8qCi0gICAgKiBTUEVDICJGb3IgYSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYQorICAgICogU1BFQyAiRm9yIGEgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSDvv712YWxpZCByZXN0cmljdGlvbu+/vSBvZiBhCiAgICAgKiB3aWxkY2FyZCBwYXJ0aWNsZS4uLiIKICAgICAqCi0gICAgKiBTUEVDICgxKSAiRXZlcnkgbWVtYmVyIG9mIHRoZSB7cGFydGljbGVzfSBvZiB0aGUgZ3JvdXAgaXMgYSC3dmFsaWQKLSAgICAqIHJlc3RyaWN0aW9utyBvZiB0aGUgd2lsZGNhcmQgYXMgZGVmaW5lZCBieQotICAgICogUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4iCisgICAgKiBTUEVDICgxKSAiRXZlcnkgbWVtYmVyIG9mIHRoZSB7cGFydGljbGVzfSBvZiB0aGUgZ3JvdXAgaXMgYSDvv712YWxpZAorICAgICogcmVzdHJpY3Rpb27vv70gb2YgdGhlIHdpbGRjYXJkIGFzIGRlZmluZWQgYnkKKyAgICAqIFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKO+/vTMuOS42KS4iCiAgICAgKi8KICAgICBwYXJ0ID0gKHhtbFNjaGVtYVBhcnRpY2xlUHRyKSByLT5jaGlsZHJlbi0+Y2hpbGRyZW47CiAgICAgZG8gewpAQCAtMTY5OTEsNyArMTY5OTQsNyBAQAogICAgIC8qCiAgICAgKiBTUEVDICgyKSAiVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiB0aGUgZ3JvdXAgWy4uLl0gaXMgYQogICAgICogdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieQotICAgICogT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4iCisgICAgKiBPY2N1cnJlbmNlIFJhbmdlIE9LICjvv70zLjkuNikuIgogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYUNoZWNrUGFydGljbGVSYW5nZU9LKAogCSAgICB4bWxTY2hlbWFHZXRQYXJ0aWNsZVRvdGFsUmFuZ2VNaW4ociksCkBAIC0xNzAwMCw2ICsxNzAwMyw3IEBACiAJcmV0dXJuICgxKTsKICAgICByZXR1cm4gKDApOwogfQorI2VuZGlmCiAKIC8qKgogICogeG1sU2NoZW1hQ2hlY2tSQ2FzZVJlY3Vyc2U6CkBAIC0xNzAzMCwxMSArMTcwMzQsMTEgQEAKIAkoci0+Y2hpbGRyZW4tPnR5cGUgIT0gYi0+Y2hpbGRyZW4tPnR5cGUpKQogCXJldHVybiAoLTEpOwogICAgIC8qCi0gICAgKiBTUEVDICJGb3IgYW4gYWxsIG9yIHNlcXVlbmNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkCi0gICAgKiByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBncm91cCBwYXJ0aWNsZSB3aXRoIHRoZSBzYW1lIHtjb21wb3NpdG9yfS4uLiIKKyAgICAqIFNQRUMgIkZvciBhbiBhbGwgb3Igc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSDvv712YWxpZAorICAgICogcmVzdHJpY3Rpb27vv70gb2YgYW5vdGhlciBncm91cCBwYXJ0aWNsZSB3aXRoIHRoZSBzYW1lIHtjb21wb3NpdG9yfS4uLiIKICAgICAqCiAgICAgKiBTUEVDICgxKSAiUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3MKLSAgICAqIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLiIKKyAgICAqIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICjvv70zLjkuNikuIgogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYUNoZWNrUGFydGljbGVSYW5nZU9LKHItPm1pbk9jY3Vycywgci0+bWF4T2NjdXJzLAogCSAgICBiLT5taW5PY2N1cnMsIGItPm1heE9jY3VycykpCkBAIC0xNzEzMSw3ICsxNzEzNSw3IEBACiAKICAgICAvKgogICAgICogU1BFQyBzdC1yZXN0cmljdC1mYWNldHMgMToKLSAgICAqICJUaGUge3ZhcmlldHl9IG9mIFIgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBCLiIgICAgCisgICAgKiAiVGhlIHt2YXJpZXR5fSBvZiBSIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgQi4iCiAgICAgKi8KICAgICAvKgogICAgICogU1BFQyBzdC1yZXN0cmljdC1mYWNldHMgMjoKQEAgLTE3NjAzLDcgKzE3NjA3LDcgQEAKIAkJCSogVGhlIHdoaXRlc3BhY2UgbXVzdCBiZSBzdHJvbmdlci4KIAkJCSovCiAJCQlpZiAoZmFjZXQtPndoaXRlc3BhY2UgPCBiZmFjZXQtPndoaXRlc3BhY2UpIHsKLQkJCSAgICBGQUNFVF9SRVNUUl9FUlIoZmxlbmd0aCwKKwkJCSAgICBGQUNFVF9SRVNUUl9FUlIoZmFjZXQsCiAJCQkJIlRoZSAnd2hpdGVzcGFjZScgdmFsdWUgaGFzIHRvIGJlIGVxdWFsIHRvICIKIAkJCQkib3Igc3Ryb25nZXIgdGhhbiB0aGUgJ3doaXRlc3BhY2UnIHZhbHVlIG9mICIKIAkJCQkidGhlIGJhc2UgdHlwZSIpCkBAIC0xNzY1OCw3ICsxNzY2Miw3IEBACiAgICAgeG1sU2NoZW1hVHlwZUxpbmtQdHIgbGluaywgbGFzdExpbmssIHByZXZMaW5rLCBzdWJMaW5rLCBuZXdMaW5rOwogICAgIC8qCiAgICAgKiBUaGUgYWN0dWFsIHZhbHVlIGlzIHRoZW4gZm9ybWVkIGJ5IHJlcGxhY2luZyBhbnkgdW5pb24gdHlwZQotICAgICogZGVmaW5pdGlvbiBpbiB0aGUgt2V4cGxpY2l0IG1lbWJlcnO3IHdpdGggdGhlIG1lbWJlcnMgb2YgdGhlaXIKKyAgICAqIGRlZmluaXRpb24gaW4gdGhlIO+/vWV4cGxpY2l0IG1lbWJlcnPvv70gd2l0aCB0aGUgbWVtYmVycyBvZiB0aGVpcgogICAgICoge21lbWJlciB0eXBlIGRlZmluaXRpb25zfSwgaW4gb3JkZXIuCiAgICAgKgogICAgICogVE9ETzogVGhlcmUncyBhIGJ1ZyBlbnRyeSBhdApAQCAtMTc3MDQsNyArMTc3MDgsNyBAQAogCiBzdGF0aWMgdm9pZAogeG1sU2NoZW1hVHlwZUZpeHVwT3B0aW1GYWNldHMoeG1sU2NoZW1hVHlwZVB0ciB0eXBlKQoteyAgICAgICAKK3sKICAgICBpbnQgaGFzID0gMCwgbmVlZFZhbCA9IDAsIG5vcm1WYWwgPSAwOwogCiAgICAgaGFzCT0gKHR5cGUtPmJhc2VUeXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfSEFTX0ZBQ0VUUykgPyAxIDogMDsKQEAgLTE3NzE2LDcgKzE3NzIwLDcgQEAKICAgICB9CiAgICAgaWYgKHR5cGUtPmZhY2V0cyAhPSBOVUxMKSB7CiAJeG1sU2NoZW1hRmFjZXRQdHIgZmFjOwotCQorCiAJZm9yIChmYWMgPSB0eXBlLT5mYWNldHM7IGZhYyAhPSBOVUxMOyBmYWMgPSBmYWMtPm5leHQpIHsKIAkgICAgc3dpdGNoIChmYWMtPnR5cGUpIHsKIAkJY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0U6CkBAIC0xNzczNCw3ICsxNzczOCw3IEBACiAJCSAgICBoYXMgPSAxOwogCQkgICAgYnJlYWs7CiAJICAgIH0KLQl9CQorCX0KICAgICB9CiAgICAgaWYgKG5vcm1WYWwpCiAJdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9OT1JNVkFMVUVORUVERUQ7CkBAIC0xNzc1MSwyNCArMTc3NTUsMjQgQEAKIAlpZiAoKHByaW0tPmJ1aWx0SW5UeXBlICE9IFhNTF9TQ0hFTUFTX0FOWVNJTVBMRVRZUEUpICYmCiAJICAgIChwcmltLT5idWlsdEluVHlwZSAhPSBYTUxfU0NIRU1BU19TVFJJTkcpKSB7CiAJICAgIHR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfRkFDRVRTTkVFRFZBTFVFOwotCX0gCQotICAgIH0gICAgICAgCisJfQorICAgIH0KIH0KIAogc3RhdGljIGludAogeG1sU2NoZW1hVHlwZUZpeHVwV2hpdGVzcGFjZSh4bWxTY2hlbWFUeXBlUHRyIHR5cGUpCiB7Ci0gICAgCi0gICAgCisKKwogICAgIC8qCiAgICAgKiBFdmFsdWF0ZSB0aGUgd2hpdGVzcGFjZS1mYWNldCB2YWx1ZS4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIGlmIChXWFNfSVNfTElTVCh0eXBlKSkgewogCXR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfV0hJVEVTUEFDRV9DT0xMQVBTRTsKIAlyZXR1cm4gKDApOwogICAgIH0gZWxzZSBpZiAoV1hTX0lTX1VOSU9OKHR5cGUpKQogCXJldHVybiAoMCk7Ci0gICAgCisKICAgICBpZiAodHlwZS0+ZmFjZXRTZXQgIT0gTlVMTCkgewogCXhtbFNjaGVtYUZhY2V0TGlua1B0ciBsaW47CiAKQEAgLTE3NzkyLDIzICsxNzc5NiwyMyBAQAogCX0KICAgICB9CiAgICAgLyoKLSAgICAqIEZvciBhbGwgt2F0b21pY7cgZGF0YXR5cGVzIG90aGVyIHRoYW4gc3RyaW5nIChhbmQgdHlwZXMgt2Rlcml2ZWS3IAotICAgICogYnkgt3Jlc3RyaWN0aW9utyBmcm9tIGl0KSB0aGUgdmFsdWUgb2Ygd2hpdGVTcGFjZSBpcyBmaXhlZCB0byAKKyAgICAqIEZvciBhbGwg77+9YXRvbWlj77+9IGRhdGF0eXBlcyBvdGhlciB0aGFuIHN0cmluZyAoYW5kIHR5cGVzIO+/vWRlcml2ZWTvv70KKyAgICAqIGJ5IO+/vXJlc3RyaWN0aW9u77+9IGZyb20gaXQpIHRoZSB2YWx1ZSBvZiB3aGl0ZVNwYWNlIGlzIGZpeGVkIHRvCiAgICAgKiBjb2xsYXBzZQogICAgICovCiAgICAgewogCXhtbFNjaGVtYVR5cGVQdHIgYW5jOwogCi0JZm9yIChhbmMgPSB0eXBlLT5iYXNlVHlwZTsgYW5jICE9IE5VTEwgJiYgCisJZm9yIChhbmMgPSB0eXBlLT5iYXNlVHlwZTsgYW5jICE9IE5VTEwgJiYKIAkJYW5jLT5idWlsdEluVHlwZSAhPSBYTUxfU0NIRU1BU19BTllUWVBFOwogCQlhbmMgPSBhbmMtPmJhc2VUeXBlKSB7CiAKIAkgICAgaWYgKGFuYy0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfQkFTSUMpIHsKLQkJaWYgKGFuYy0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfTk9STVNUUklORykgewkgICAgCisJCWlmIChhbmMtPmJ1aWx0SW5UeXBlID09IFhNTF9TQ0hFTUFTX05PUk1TVFJJTkcpIHsKIAkJICAgIHR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfV0hJVEVTUEFDRV9SRVBMQUNFOwogCiAJCX0gZWxzZSBpZiAoKGFuYy0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfU1RSSU5HKSB8fAotCQkgICAgKGFuYy0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfQU5ZU0lNUExFVFlQRSkpIHsJCSAgICAKKwkJICAgIChhbmMtPmJ1aWx0SW5UeXBlID09IFhNTF9TQ0hFTUFTX0FOWVNJTVBMRVRZUEUpKSB7CiAJCSAgICB0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX1dISVRFU1BBQ0VfUFJFU0VSVkU7CiAKIAkJfSBlbHNlCkBAIC0xNzg0NSw3ICsxNzg0OSw3IEBACiAgICAgfSBlbHNlIGlmIChXWFNfSVNfVU5JT04odHlwZSkpIHsKIAkvKgogCSogQ29ycmVzcG9uZHMgdG8gPHNpbXBsZVR5cGU+PHVuaW9uPi4uLgotCSovCQorCSovCiAJaWYgKHR5cGUtPm1lbWJlclR5cGVzID09IE5VTEwpIHsKIAkgICAgLyoKIAkgICAgKiBUaGlzIG9uZSBpcyByZWFsbHkgbmVlZGVkLCBzbyBnZXQgb3V0LgpAQCAtMTc4NTMsOCArMTc4NTcsOCBAQAogCSAgICBQRVJST1JfSU5UKCJ4bWxTY2hlbWFGaXh1cFNpbXBsZVR5cGVTdGFnZU9uZSIsCiAJCSJ1bmlvbiB0eXBlIGhhcyBubyBtZW1iZXItdHlwZXMgYXNzaWduZWQiKTsKIAkgICAgcmV0dXJuKC0xKTsKLQl9CSAgICAKLSAgICB9IGVsc2UgeyAgICAKKwl9CisgICAgfSBlbHNlIHsKIAkvKgogCSogQ29ycmVzcG9uZHMgdG8gPHNpbXBsZVR5cGU+PHJlc3RyaWN0aW9uPi4uLgogCSovCkBAIC0xNzk2OSw3ICsxNzk3Myw3IEBACiAgICAgfQogICAgIGlmIChXWFNfSVNfVFlQRV9OT1RfRklYRUQodHlwZS0+YmFzZVR5cGUpKQogCXhtbFNjaGVtYVR5cGVGaXh1cCh0eXBlLT5iYXNlVHlwZSwgQUNUWFRfQ0FTVCBwY3R4dCk7Ci0gICAgLyogCisgICAgLyoKICAgICAqIElmIGEgbWVtYmVyIHR5cGUgb2YgYSB1bmlvbiBpcyBhIHVuaW9uIGl0c2VsZiwgd2UgbmVlZCB0byBzdWJzdGl0dXRlCiAgICAgKiB0aGF0IG1lbWJlciB0eXBlIGZvciBpdHMgbWVtYmVyIHR5cGVzLgogICAgICogTk9URSB0aGF0IHRoaXMgbWlnaHQgY2hhbmdlIGluIFdYUyAxLjE7IGkuZS4gd2Ugd2lsbCBrZWVwIHRoZSB1bmlvbgpAQCAtMTc5NzcsMTIgKzE3OTgxLDEyIEBACiAgICAgKi8KICAgICBpZiAoKHR5cGUtPm1lbWJlclR5cGVzICE9IE5VTEwpICYmCiAJKHhtbFNjaGVtYUZpbmlzaE1lbWJlclR5cGVEZWZpbml0aW9uc1Byb3BlcnR5KHBjdHh0LCB0eXBlKSA9PSAtMSkpCi0JcmV0dXJuKC0xKTsgICAgICAgIAorCXJldHVybigtMSk7CiAgICAgLyoKLSAgICAqIFNQRUMgc3JjLXNpbXBsZS10eXBlIDEgCisgICAgKiBTUEVDIHNyYy1zaW1wbGUtdHlwZSAxCiAgICAgKiAiVGhlIGNvcnJlc3BvbmRpbmcgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgaWYgYW55LCBtdXN0IHNhdGlzZnkKICAgICAqIHRoZSBjb25kaXRpb25zIHNldCBvdXQgaW4gQ29uc3RyYWludHMgb24gU2ltcGxlIFR5cGUgRGVmaW5pdGlvbgotICAgICogU2NoZW1hIENvbXBvbmVudHMgKKczLjE0LjYpLiIKKyAgICAqIFNjaGVtYSBDb21wb25lbnRzICjvv70zLjE0LjYpLiIKICAgICAqLwogICAgIC8qCiAgICAgKiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFNpbXBsZSBUeXBlIERlZmluaXRpb24gUHJvcGVydGllcyBDb3JyZWN0CkBAIC0xNzk5MCw3ICsxNzk5NCw3IEBACiAgICAgKi8KICAgICByZXMgPSB4bWxTY2hlbWFDaGVja1NUUHJvcHNDb3JyZWN0KHBjdHh0LCB0eXBlKTsKICAgICBIRkFJTFVSRSBIRVJST1IKLSAgICAvKiAKKyAgICAvKgogICAgICogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBEZXJpdmF0aW9uIFZhbGlkIChSZXN0cmljdGlvbiwgU2ltcGxlKQogICAgICogKGNvcy1zdC1yZXN0cmljdHMpCiAgICAgKi8KQEAgLTE4MDIzLDcgKzE4MDI3LDcgQEAKICAgICAqLwogICAgIHJlcyA9IHhtbFNjaGVtYVR5cGVGaXh1cFdoaXRlc3BhY2UodHlwZSk7CiAgICAgSEZBSUxVUkUgSEVSUk9SCi0gICAgeG1sU2NoZW1hVHlwZUZpeHVwT3B0aW1GYWNldHModHlwZSk7ICAgIAorICAgIHhtbFNjaGVtYVR5cGVGaXh1cE9wdGltRmFjZXRzKHR5cGUpOwogCiBleGl0X2Vycm9yOgogI2lmZGVmIERFQlVHX1RZUEUKQEAgLTE4MDU0LDcgKzE4MDU4LDcgQEAKIAlQRVJST1JfSU5UKCJ4bWxTY2hlbWFGaXh1cENvbXBsZXhUeXBlIiwKIAkgICAgIm1pc3NpbmcgYmFzZVR5cGUiKTsKIAlnb3RvIGV4aXRfZmFpbHVyZTsKLSAgICB9ICAgIAorICAgIH0KICAgICAvKgogICAgICogRml4dXAgdGhlIGJhc2UgdHlwZS4KICAgICAqLwpAQCAtMTgwNjYsMTIgKzE4MDcwLDEyIEBACiAJKiBUT0RPOiBHZW5lcmF0ZSBhIHdhcm5pbmchCiAJKi8KIAlyZXR1cm4oMCk7Ci0gICAgfQkKKyAgICB9CiAgICAgLyoKICAgICAqIFRoaXMgYmFzaWNhbGx5IGNoZWNrcyBpZiB0aGUgYmFzZSB0eXBlIGNhbiBiZSBkZXJpdmVkLgogICAgICovCiAgICAgcmVzID0geG1sU2NoZW1hQ2hlY2tTUkNDVChwY3R4dCwgdHlwZSk7Ci0gICAgSEZBSUxVUkUgSEVSUk9SICAgCisgICAgSEZBSUxVUkUgSEVSUk9SCiAgICAgLyoKICAgICAqIEZpeHVwIHRoZSBjb250ZW50IHR5cGUuCiAgICAgKi8KQEAgLTE4MTQ1LDcgKzE4MTQ5LDcgQEAKIAkgICAgdHlwZS0+ZmFjZXRzID0gTlVMTDsKIAkgICAgY29udGVudC0+ZmFjZXRTZXQgPSB0eXBlLT5mYWNldFNldDsKIAkgICAgdHlwZS0+ZmFjZXRTZXQgPSBOVUxMOwotCSAgICAKKwogCSAgICB0eXBlLT5jb250ZW50VHlwZURlZiA9IGNvbnRlbnQ7CiAJICAgIGlmIChXWFNfSVNfVFlQRV9OT1RfRklYRUQoY29udGVudEJhc2UpKQogCQl4bWxTY2hlbWFUeXBlRml4dXAoY29udGVudEJhc2UsIEFDVFhUX0NBU1QgcGN0eHQpOwpAQCAtMTgxNTQsMTAgKzE4MTU4LDEwIEBACiAJICAgICogZm9yIGNpcmN1bGFyaXR5IGhlcmUuCiAJICAgICovCiAJICAgIHJlcyA9IHhtbFNjaGVtYUZpeHVwU2ltcGxlVHlwZVN0YWdlT25lKHBjdHh0LCBjb250ZW50KTsKLQkgICAgSEZBSUxVUkUgSEVSUk9SIAorCSAgICBIRkFJTFVSRSBIRVJST1IKIAkgICAgcmVzID0geG1sU2NoZW1hRml4dXBTaW1wbGVUeXBlU3RhZ2VUd28ocGN0eHQsIGNvbnRlbnQpOwotCSAgICBIRkFJTFVSRSBIRVJST1IgCi0JCQorCSAgICBIRkFJTFVSRSBIRVJST1IKKwogCX0gZWxzZSBpZiAoKFdYU19JU19DT01QTEVYKGJhc2VUeXBlKSkgJiYKIAkgICAgKGJhc2VUeXBlLT5jb250ZW50VHlwZSA9PSBYTUxfU0NIRU1BX0NPTlRFTlRfTUlYRUQpICYmCiAJICAgIChXWFNfSVNfUkVTVFJJQ1RJT04odHlwZSkpKSB7CkBAIC0xODI0Miw3ICsxODI0Niw3IEBACiAJICAgICggKCh4bWxTY2hlbWFUcmVlSXRlbVB0cikgcGFydGljbGUtPmNoaWxkcmVuKS0+Y2hpbGRyZW4gPT0gTlVMTCkpKSB7CiAJICAgIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfTUlYRUQpIHsKIAkJLyoKLQkJKiBTUEVDICgyLjEuNCkgIklmIHRoZSC3ZWZmZWN0aXZlIG1peGVktyBpcyB0cnVlLCB0aGVuCisJCSogU1BFQyAoMi4xLjQpICJJZiB0aGUg77+9ZWZmZWN0aXZlIG1peGVk77+9IGlzIHRydWUsIHRoZW4KIAkJKiBhIHBhcnRpY2xlIHdob3NlIHByb3BlcnRpZXMgYXJlIGFzIGZvbGxvd3M6Li4uIgogCQkqCiAJCSogRW1wdHkgc2VxdWVuY2UgbW9kZWwgZ3JvdXAgd2l0aApAQCAtMTgyNjcsNyArMTgyNzEsNyBAQAogCQkJWE1MX1NDSEVNQV9UWVBFX1NFUVVFTkNFLCB0eXBlLT5ub2RlKTsKIAkJICAgIGlmIChwYXJ0aWNsZS0+Y2hpbGRyZW4gPT0gTlVMTCkKIAkJCWdvdG8gZXhpdF9mYWlsdXJlOwotCQkgICAgCisKIAkJICAgIHR5cGUtPnN1YnR5cGVzID0gKHhtbFNjaGVtYVR5cGVQdHIpIHBhcnRpY2xlOwogCQl9CiAJCWR1bW15U2VxdWVuY2UgPSAxOwpAQCAtMTgzMDQsNyArMTgzMDgsNyBAQAogCSAgICBpZiAodHlwZS0+Y29udGVudFR5cGUgPT0gWE1MX1NDSEVNQV9DT05URU5UX0VNUFRZKSB7CiAJCS8qCiAJCSogU1BFQyAoMy4yLjEpCi0JCSogIklmIHRoZSC3ZWZmZWN0aXZlIGNvbnRlbnS3IGlzIGVtcHR5LCB0aGVuIHRoZQorCQkqICJJZiB0aGUg77+9ZWZmZWN0aXZlIGNvbnRlbnTvv70gaXMgZW1wdHksIHRoZW4gdGhlCiAJCSogIHtjb250ZW50IHR5cGV9IG9mIHRoZSBbLi4uXSBiYXNlIC4uLiIKIAkJKi8KIAkJdHlwZS0+Y29udGVudFR5cGUgPSBiYXNlVHlwZS0+Y29udGVudFR5cGU7CkBAIC0xODQxMSw3ICsxODQxNSw3IEBACiAJCSAgICBwYXJ0aWNsZS0+Y2hpbGRyZW4gPQogCQkJKCh4bWxTY2hlbWFQYXJ0aWNsZVB0cikgYmFzZVR5cGUtPnN1YnR5cGVzKS0+Y2hpbGRyZW47CiAJCSAgICAvKgotCQkgICAgKiBTUEVDICJmb2xsb3dlZCBieSB0aGUgt2VmZmVjdGl2ZSBjb250ZW50ty4iCisJCSAgICAqIFNQRUMgImZvbGxvd2VkIGJ5IHRoZSDvv71lZmZlY3RpdmUgY29udGVudO+/vS4iCiAJCSAgICAqLwogCQkgICAgcGFydGljbGUtPm5leHQgPSBlZmZlY3RpdmVDb250ZW50OwogCQkgICAgLyoKQEAgLTE4NTU1LDEyICsxODU1OSwxMiBAQAogCiAJCS8qIDQuMy41LjUgQ29uc3RyYWludHMgb24gZW51bWVyYXRpb24gU2NoZW1hIENvbXBvbmVudHMKIAkJKiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IGVudW1lcmF0aW9uIHZhbGlkIHJlc3RyaWN0aW9uCi0JCSogSXQgaXMgYW4gt2Vycm9ytyBpZiBhbnkgbWVtYmVyIG9mIHt2YWx1ZX0gaXMgbm90IGluIHRoZQotCQkqILd2YWx1ZSBzcGFjZbcgb2Yge2Jhc2UgdHlwZSBkZWZpbml0aW9ufS4KKwkJKiBJdCBpcyBhbiDvv71lcnJvcu+/vSBpZiBhbnkgbWVtYmVyIG9mIHt2YWx1ZX0gaXMgbm90IGluIHRoZQorCQkqIO+/vXZhbHVlIHNwYWNl77+9IG9mIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0uCiAJCSoKIAkJKiBtaW5JbmNsdXNpdmUsIG1heEluY2x1c2l2ZSwgbWluRXhjbHVzaXZlLCBtYXhFeGNsdXNpdmU6Ci0JCSogVGhlIHZhbHVlILdtdXN0tyBiZSBpbiB0aGUKLQkJKiC3dmFsdWUgc3BhY2W3IG9mIHRoZSC3YmFzZSB0eXBlty4KKwkJKiBUaGUgdmFsdWUg77+9bXVzdO+/vSBiZSBpbiB0aGUKKwkJKiDvv712YWx1ZSBzcGFjZe+/vSBvZiB0aGUg77+9YmFzZSB0eXBl77+9LgogCQkqLwogCQkvKgogCQkqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gZGVsaXZlciBhIGNvbXBpbGVkIHZhbHVlCkBAIC0xODU4MCwxMSArMTg1ODQsMTEgQEAKIAkJICAgIH0KIAkJfSBlbHNlCiAJCSAgICBiYXNlID0gdHlwZURlY2w7Ci0JICAgICAgICAgICAgICAgICAKKwogCQlpZiAoISBjdHh0R2l2ZW4pIHsKIAkJICAgIC8qCiAJCSAgICAqIEEgY29udGV4dCBpcyBuZWVkZWQgaWYgY2FsbGVkIGZyb20gUmVsYXhORy4KLQkJICAgICovCQkgICAgCisJCSAgICAqLwogCQkgICAgcGN0eHQgPSB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0KCIqIik7CiAJCSAgICBpZiAocGN0eHQgPT0gTlVMTCkKIAkJCXJldHVybiAoLTEpOwpAQCAtMTg1OTUsMTcgKzE4NTk5LDE3IEBACiAJCSogZmFjZXQtPm5vZGUgaXMganVzdCB0aGUgbm9kZSBob2xkaW5nIHRoZSBmYWNldAogCQkqIGRlZmluaXRpb24sICpub3QqIHRoZSBhdHRyaWJ1dGUgaG9sZGluZyB0aGUgKnZhbHVlKgogCQkqIG9mIHRoZSBmYWNldC4KLQkJKi8JCQorCQkqLwogCQlyZXQgPSB4bWxTY2hlbWFWQ2hlY2tDVkNTaW1wbGVUeXBlKAogCQkgICAgQUNUWFRfQ0FTVCBwY3R4dCwgZmFjZXQtPm5vZGUsIGJhc2UsCiAJCSAgICBmYWNldC0+dmFsdWUsICYoZmFjZXQtPnZhbCksIDEsIDEsIDApOwogICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogCQkgICAgaWYgKHJldCA8IDApIHsKIAkJCS8qIE5vIGVycm9yIG1lc3NhZ2UgZm9yIFJlbGF4TkcuICovCi0JCQlpZiAoY3R4dEdpdmVuKSB7CQkJICAgIAorCQkJaWYgKGN0eHRHaXZlbikgewogCQkJICAgIHhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIHBjdHh0LAogCQkJCVhNTF9TQ0hFTUFQX0lOVEVSTkFMLCBmYWNldC0+bm9kZSwgTlVMTCwKLQkJCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYUNoZWNrRmFjZXQsICIgCisJCQkJIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFDaGVja0ZhY2V0LCAiCiAJCQkJImZhaWxlZCB0byB2YWxpZGF0ZSB0aGUgdmFsdWUgJyVzJyBvZiB0aGUgIgogCQkJCSJmYWNldCAnJXMnIGFnYWluc3QgdGhlIGJhc2UgdHlwZSIsCiAJCQkJZmFjZXQtPnZhbHVlLCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldC0+dHlwZSkpOwpAQCAtMTg2ODAsMTcgKzE4Njg0LDE3IEBACiAJCSAgICAvKiBlcnJvciBjb2RlICovCiAJCSAgICB4bWxTY2hlbWFDdXN0b21FcnI0KEFDVFhUX0NBU1QgcGN0eHQsCiAJCQlyZXQsIGZhY2V0LT5ub2RlLCBXWFNfQkFTSUNfQ0FTVCB0eXBlRGVjbCwKLQkJCSJUaGUgdmFsdWUgJyVzJyBvZiB0aGUgZmFjZXQgJyVzJyBpcyBub3QgYSB2YWxpZCAnJXMnIiwJCQkKKwkJCSJUaGUgdmFsdWUgJyVzJyBvZiB0aGUgZmFjZXQgJyVzJyBpcyBub3QgYSB2YWxpZCAnJXMnIiwKIAkJCWZhY2V0LT52YWx1ZSwKIAkJCXhtbFNjaGVtYUZhY2V0VHlwZVRvU3RyaW5nKGZhY2V0LT50eXBlKSwKLQkJCShmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1RPVEFMRElHSVRTKSA/IAorCQkJKGZhY2V0LT50eXBlICE9IFhNTF9TQ0hFTUFfRkFDRVRfVE9UQUxESUdJVFMpID8KIAkJCSAgICBCQURfQ0FTVCAibm9uTmVnYXRpdmVJbnRlZ2VyIiA6CiAJCQkgICAgQkFEX0NBU1QgInBvc2l0aXZlSW50ZWdlciIsCiAJCQlOVUxMKTsKIAkJfQogCSAgICB9CiAJICAgIGJyZWFrOwotICAgICAgICAgICAgCisKICAgICAgICAgY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0U6ewogICAgICAgICAgICAgICAgIGlmICh4bWxTdHJFcXVhbChmYWNldC0+dmFsdWUsIEJBRF9DQVNUICJwcmVzZXJ2ZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhY2V0LT53aGl0ZXNwYWNlID0gWE1MX1NDSEVNQVNfRkFDRVRfUFJFU0VSVkU7CkBAIC0xODkwMyw3ICsxODkwNyw3IEBACiAJewogCSAgICBwYXJ0aWNsZSA9IFdYU19QVENfQ0FTVCBwYXJ0aWNsZS0+bmV4dDsKIAkgICAgY29udGludWU7Ci0JfSAKKwl9CiAJaWYgKFdYU19NT0RFTEdST1VQREVGX01PREVMKFdYU19QQVJUSUNMRV9URVJNKHBhcnRpY2xlKSkgPT0gTlVMTCkgewogCSAgICAvKgogCSAgICAqIFRPRE86IFJlbW92ZSB0aGUgcGFydGljbGUuCkBAIC0xODk1Myw3ICsxODk1Nyw3IEBACiAJICAgIGlmIChnciA9PSBjdHh0R3IpCiAJCXJldHVybihyZWYpOwogCSAgICBpZiAoZ3ItPmZsYWdzICYgWE1MX1NDSEVNQVNfQVRUUkdST1VQX01BUktFRCkKLQkJY29udGludWU7CSAgICAKKwkJY29udGludWU7CiAJICAgIC8qCiAJICAgICogTWFyayBhcyB2aXNpdGVkIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBvbgogCSAgICAqIGNpcmN1bGFyIHJlZmVyZW5jZXMgbm90IHlldCBleGFtaW5lZC4KQEAgLTE4OTYzLDEyICsxODk2NywxMiBAQAogCSAgICB7CiAJCWdyLT5mbGFncyB8PSBYTUxfU0NIRU1BU19BVFRSR1JPVVBfTUFSS0VEOwogCQljaXJjID0geG1sU2NoZW1hQ2hlY2tBdHRyR3JvdXBDaXJjdWxhclJlY3VyKGN0eHRHciwKLQkJICAgICh4bWxTY2hlbWFJdGVtTGlzdFB0cikgZ3ItPmF0dHJVc2VzKTsJCQorCQkgICAgKHhtbFNjaGVtYUl0ZW1MaXN0UHRyKSBnci0+YXR0clVzZXMpOwogCQlnci0+ZmxhZ3MgXj0gWE1MX1NDSEVNQVNfQVRUUkdST1VQX01BUktFRDsKIAkJaWYgKGNpcmMgIT0gTlVMTCkKIAkJICAgIHJldHVybiAoY2lyYyk7CiAJICAgIH0KLQkgICAgCisKIAl9CiAgICAgfQogICAgIHJldHVybiAoTlVMTCk7CkBAIC0xODk5NSw5ICsxODk5OSw5IEBACiAgICAgKiBub3QgYmUgYW4gPGF0dHJpYnV0ZUdyb3VwPiB3aXRoIHJlZiBbYXR0cmlidXRlXSB3aGljaCByZXNvbHZlcwogICAgICogdG8gdGhlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgPGF0dHJpYnV0ZUdyb3VwPi4gSW5kaXJlY3QKICAgICAqIGNpcmN1bGFyaXR5IGlzIGFsc28gcnVsZWQgb3V0LiBUaGF0IGlzLCB3aGVuIFFOYW1lIHJlc29sdXRpb24KLSAgICAqIChTY2hlbWEgRG9jdW1lbnQpICinMy4xNS4zKSBpcyBhcHBsaWVkIHRvIGEgt1FOYW1ltyBhcmlzaW5nIGZyb20KKyAgICAqIChTY2hlbWEgRG9jdW1lbnQpICjvv70zLjE1LjMpIGlzIGFwcGxpZWQgdG8gYSDvv71RTmFtZe+/vSBhcmlzaW5nIGZyb20KICAgICAqIGFueSA8YXR0cmlidXRlR3JvdXA+cyB3aXRoIGEgcmVmIFthdHRyaWJ1dGVdIGFtb25nIHRoZSBbY2hpbGRyZW5dLAotICAgICogaXQgbXVzdCBub3QgYmUgdGhlIGNhc2UgdGhhdCBhILdRTmFtZbcgaXMgZW5jb3VudGVyZWQgYXQgYW55IGRlcHRoCisgICAgKiBpdCBtdXN0IG5vdCBiZSB0aGUgY2FzZSB0aGF0IGEg77+9UU5hbWXvv70gaXMgZW5jb3VudGVyZWQgYXQgYW55IGRlcHRoCiAgICAgKiB3aGljaCByZXNvbHZlcyB0byB0aGUgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyA8YXR0cmlidXRlR3JvdXA+LgogICAgICovCiAgICAgaWYgKGF0dHJHci0+YXR0clVzZXMgPT0gTlVMTCkKQEAgLTE5MDA2LDkgKzE5MDEwLDkgQEAKIAlyZXR1cm4oMCk7CiAgICAgZWxzZSB7CiAJeG1sU2NoZW1hUU5hbWVSZWZQdHIgY2lyYzsKLQkKKwogCWNpcmMgPSB4bWxTY2hlbWFDaGVja0F0dHJHcm91cENpcmN1bGFyUmVjdXIoYXR0ckdyLAotCSAgICAoeG1sU2NoZW1hSXRlbUxpc3RQdHIpIGF0dHJHci0+YXR0clVzZXMpOwkKKwkgICAgKHhtbFNjaGVtYUl0ZW1MaXN0UHRyKSBhdHRyR3ItPmF0dHJVc2VzKTsKIAlpZiAoY2lyYyAhPSBOVUxMKSB7CiAJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CiAJICAgIC8qCkBAIC0xOTA0MCw3ICsxOTA0NCw3IEBACiAgKiB4bWxTY2hlbWFFeHBhbmRBdHRyaWJ1dGVHcm91cFJlZnM6CiAgKiBAcGN0eHQ6IHRoZSBwYXJzZXIgY29udGV4dAogICogQG5vZGU6IHRoZSBub2RlIG9mIHRoZSBjb21wb25lbnQgaG9sZGluZyB0aGUgYXR0cmlidXRlIHVzZXMKLSAqIEBjb21wbGV0ZVdpbGQ6IHRoZSBpbnRlcnNlY3RlZCB3aWxkY2FyZCB0byBiZSByZXR1cm5lZCAKKyAqIEBjb21wbGV0ZVdpbGQ6IHRoZSBpbnRlcnNlY3RlZCB3aWxkY2FyZCB0byBiZSByZXR1cm5lZAogICogQGxpc3Q6IHRoZSBhdHRyaWJ1dGUgdXNlcwogICoKICAqIFN1YnN0aXR1dGVzIGNvbnRhaW5lZCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlcwpAQCAtMTkwNjksNyArMTkwNzMsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0LT5uYkl0ZW1zOyBpKyspIHsKIAl1c2UgPSBsaXN0LT5pdGVtc1tpXTsKIAotCWlmICh1c2UtPnR5cGUgPT0gWE1MX1NDSEVNQV9FWFRSQV9BVFRSX1VTRV9QUk9ISUIpIHsJICAgIAorCWlmICh1c2UtPnR5cGUgPT0gWE1MX1NDSEVNQV9FWFRSQV9BVFRSX1VTRV9QUk9ISUIpIHsKIAkgICAgaWYgKHByb2hpYnMgPT0gTlVMTCkgewogCQlQRVJST1JfSU5UKCJ4bWxTY2hlbWFFeHBhbmRBdHRyaWJ1dGVHcm91cFJlZnMiLAogCQkgICAgInVuZXhwZWN0ZWQgYXR0ciBwcm9oaWJpdGlvbiBmb3VuZCIpOwpAQCAtMTkwODQsNyArMTkwODgsNyBAQAogCSAgICAvKgogCSAgICAqIE5vdGUgdGhhdCBkdXBsaWNhdGUgcHJvaGliaXRpb25zIHdlcmUgYWxyZWFkeQogCSAgICAqIGhhbmRsZWQgYXQgcGFyc2luZyB0aW1lLgotCSAgICAqLwkgICAgCisJICAgICovCiAJICAgIC8qCiAJICAgICogQWRkIHRvIGxpc3Qgb2YgcHJvaGliaXRpb25zLgogCSAgICAqLwpAQCAtMTkxMzcsNyArMTkxNDEsNyBAQAogCQkJKmNvbXBsZXRlV2lsZCA9IHRtcFdpbGQ7CiAJCQljcmVhdGVkID0gMTsKIAkJICAgIH0KLQkJICAgIAorCiAJCSAgICBpZiAoeG1sU2NoZW1hSW50ZXJzZWN0V2lsZGNhcmRzKHBjdHh0LCAqY29tcGxldGVXaWxkLAogCQkJZ3ItPmF0dHJpYnV0ZVdpbGRjYXJkKSA9PSAtMSkKIAkJCXJldHVybigtMSk7CkBAIC0xOTIxMSw3ICsxOTIxNSw3IEBACiAvKioKICAqIHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwRXhwYW5kUmVmczoKICAqIEBwY3R4dDogIHRoZSBwYXJzZXIgY29udGV4dAotICogQGF0dHJHcjogIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiAKKyAqIEBhdHRyR3I6ICB0aGUgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24KICAqCiAgKiBDb21wdXRhdGlvbiBvZjoKICAqIHthdHRyaWJ1dGUgdXNlc30gcHJvcGVydHkKQEAgLTE5MjIzLDcgKzE5MjI3LDcgQEAKIHN0YXRpYyBpbnQKIHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwRXhwYW5kUmVmcyh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHBjdHh0LAogCQkJCSAgeG1sU2NoZW1hQXR0cmlidXRlR3JvdXBQdHIgYXR0ckdyKQoteyAgCit7CiAgICAgaWYgKChhdHRyR3ItPmF0dHJVc2VzID09IE5VTEwpIHx8CiAJKGF0dHJHci0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19BVFRSR1JPVVBfV0lMRENBUkRfQlVJTERFRCkpCiAJcmV0dXJuKDApOwpAQCAtMTkyMzEsMzMgKzE5MjM1LDMzIEBACiAgICAgYXR0ckdyLT5mbGFncyB8PSBYTUxfU0NIRU1BU19BVFRSR1JPVVBfV0lMRENBUkRfQlVJTERFRDsKICAgICBpZiAoeG1sU2NoZW1hRXhwYW5kQXR0cmlidXRlR3JvdXBSZWZzKHBjdHh0LCBXWFNfQkFTSUNfQ0FTVCBhdHRyR3IsCiAJJihhdHRyR3ItPmF0dHJpYnV0ZVdpbGRjYXJkKSwgYXR0ckdyLT5hdHRyVXNlcywgTlVMTCkgPT0gLTEpCi0JcmV0dXJuKC0xKTsgICAgCisJcmV0dXJuKC0xKTsKICAgICByZXR1cm4oMCk7CiB9CiAKIC8qKgogICogeG1sU2NoZW1hQXR0cmlidXRlR3JvdXBFeHBhbmRSZWZzOgogICogQHBjdHh0OiAgdGhlIHBhcnNlciBjb250ZXh0Ci0gKiBAYXR0ckdyOiAgdGhlIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIAorICogQGF0dHJHcjogIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbgogICoKICAqIFN1YnN0aXR1dGVzIGNvbnRhaW5lZCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlcwogICogZm9yIHRoZWlyIGF0dHJpYnV0ZSB1c2VzLiBXaWxjYXJkcyBhcmUgaW50ZXJzZWN0ZWQuCi0gKiAKKyAqCiAgKiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6Ci0gKiAgICBBdHRyaWJ1dGUgR3JvdXAgRGVmaW5pdGlvbiBQcm9wZXJ0aWVzIENvcnJlY3QgKGFnLXByb3BzLWNvcnJlY3QpIAorICogICAgQXR0cmlidXRlIEdyb3VwIERlZmluaXRpb24gUHJvcGVydGllcyBDb3JyZWN0IChhZy1wcm9wcy1jb3JyZWN0KQogICovCiBzdGF0aWMgaW50CiB4bWxTY2hlbWFDaGVja0FHUHJvcHNDb3JyZWN0KHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgcGN0eHQsCiAJCQkJICB4bWxTY2hlbWFBdHRyaWJ1dGVHcm91cFB0ciBhdHRyR3IpCi17ICAKK3sKICAgICAvKgogICAgICogU1BFQyBhZy1wcm9wcy1jb3JyZWN0CiAgICAgKiAoMSkgIlRoZSB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgb2YgYW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24KICAgICAqIG11c3QgYmUgYXMgZGVzY3JpYmVkIGluIHRoZSBwcm9wZXJ0eSB0YWJsZWF1IGluIFRoZSBBdHRyaWJ1dGUKLSAgICAqIEdyb3VwIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudCAopzMuNi4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YKLSAgICAqIE1pc3NpbmcgU3ViLWNvbXBvbmVudHMgKKc1LjMpOyIKKyAgICAqIEdyb3VwIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudCAo77+9My42LjEpLCBtb2R1bG8gdGhlIGltcGFjdCBvZgorICAgICogTWlzc2luZyBTdWItY29tcG9uZW50cyAo77+9NS4zKTsiCiAgICAgKi8KLSAgICAKKwogICAgIGlmICgoYXR0ckdyLT5hdHRyVXNlcyAhPSBOVUxMKSAmJgogCShXWFNfTElTVF9DQVNUIGF0dHJHci0+YXR0clVzZXMpLT5uYkl0ZW1zID4gMSkKICAgICB7CkBAIC0xOTI2Niw3ICsxOTI3MCw3IEBACiAJaW50IGksIGosIGhhc0lkID0gMDsKIAogCWZvciAoaSA9IHVzZXMtPm5iSXRlbXMgLTE7IGkgPj0gMDsgaS0tKSB7Ci0JICAgIHVzZSA9IHVzZXMtPml0ZW1zW2ldOwkgICAgCisJICAgIHVzZSA9IHVzZXMtPml0ZW1zW2ldOwogCSAgICAvKgogCSAgICAqIFNQRUMgYWctcHJvcHMtY29ycmVjdAogCSAgICAqICgyKSAiVHdvIGRpc3RpbmN0IG1lbWJlcnMgb2YgdGhlIHthdHRyaWJ1dGUgdXNlc30gbXVzdCBub3QgaGF2ZQpAQCAtMTkyODIsNyArMTkyODYsNyBAQAogCQkJV1hTX0FUVFJVU0VfREVDTF9UTlModG1wKSkpCiAJCSAgICB7CiAJCQl4bWxDaGFyICpzdHIgPSBOVUxMOwotCQkJCisKIAkJCXhtbFNjaGVtYUN1c3RvbUVycihBQ1RYVF9DQVNUIHBjdHh0LAogCQkJICAgIFhNTF9TQ0hFTUFQX0FHX1BST1BTX0NPUlJFQ1QsCiAJCQkgICAgYXR0ckdyLT5ub2RlLCBXWFNfQkFTSUNfQ0FTVCBhdHRyR3IsCkBAIC0xOTMwNiwxMyArMTkzMTAsMTMgQEAKIAkgICAgKiBhcmUgZGVyaXZlZCBmcm9tIElELiIKIAkgICAgKiBUT0RPOiBEb2VzICdkZXJpdmVkJyBpbmNsdWRlIG1lbWJlci10eXBlcyBvZiB1bmlvbnM/CiAJICAgICovCi0JICAgIGlmIChXWFNfQVRUUlVTRV9UWVBFREVGKHVzZSkgIT0gTlVMTCkgewkJCisJICAgIGlmIChXWFNfQVRUUlVTRV9UWVBFREVGKHVzZSkgIT0gTlVMTCkgewogCQlpZiAoeG1sU2NoZW1hSXNEZXJpdmVkRnJvbUJ1aWx0SW5UeXBlKAogCQkgICAgV1hTX0FUVFJVU0VfVFlQRURFRih1c2UpLCBYTUxfU0NIRU1BU19JRCkpCi0JCXsJCQorCQl7CiAJCSAgICBpZiAoaGFzSWQpIHsKIAkJCXhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JCQkKKwogCQkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgcGN0eHQsCiAJCQkgICAgWE1MX1NDSEVNQVBfQUdfUFJPUFNfQ09SUkVDVCwKIAkJCSAgICBhdHRyR3ItPm5vZGUsIFdYU19CQVNJQ19DQVNUIGF0dHJHciwKQEAgLTE5MzI1LDcgKzE5MzI5LDcgQEAKIAkJCUZSRUVfQU5EX05VTEwoc3RyKTsKIAkJCWlmICh4bWxTY2hlbWFJdGVtTGlzdFJlbW92ZSh1c2VzLCBpKSA9PSAtMSkKIAkJCSAgICByZXR1cm4oLTEpOwotCQkgICAgfQkJICAgIAorCQkgICAgfQogCQkgICAgaGFzSWQgPSAxOwogCQl9CiAJICAgIH0KQEAgLTE5Mzg5LDEwICsxOTM5MywxMCBAQAogICAgICogU1BFQyBhLXByb3BzLWNvcnJlY3QgKDEpCiAgICAgKiAiVGhlIHZhbHVlcyBvZiB0aGUgcHJvcGVydGllcyBvZiBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gbXVzdAogICAgICogYmUgYXMgZGVzY3JpYmVkIGluIHRoZSBwcm9wZXJ0eSB0YWJsZWF1IGluIFRoZSBBdHRyaWJ1dGUKLSAgICAqIERlY2xhcmF0aW9uIFNjaGVtYSBDb21wb25lbnQgKKczLjIuMSksIG1vZHVsbyB0aGUgaW1wYWN0IG9mCi0gICAgKiBNaXNzaW5nIFN1Yi1jb21wb25lbnRzICinNS4zKS4iCisgICAgKiBEZWNsYXJhdGlvbiBTY2hlbWEgQ29tcG9uZW50ICjvv70zLjIuMSksIG1vZHVsbyB0aGUgaW1wYWN0IG9mCisgICAgKiBNaXNzaW5nIFN1Yi1jb21wb25lbnRzICjvv701LjMpLiIKICAgICAqLwotICAgIAorCiAgICAgaWYgKFdYU19BVFRSX1RZUEVERUYoYXR0cikgPT0gTlVMTCkKIAlyZXR1cm4oMCk7CiAKQEAgLTE5NDE4LDggKzE5NDIyLDggQEAKIAkvKgogCSogU1BFQyBhLXByb3BzLWNvcnJlY3QgKDIpCiAJKiAiaWYgdGhlcmUgaXMgYSB7dmFsdWUgY29uc3RyYWludH0sIHRoZSBjYW5vbmljYWwgbGV4aWNhbAotCSogcmVwcmVzZW50YXRpb24gb2YgaXRzIHZhbHVlIG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QKLQkqIHRvIHRoZSB7dHlwZSBkZWZpbml0aW9ufSBhcyBkZWZpbmVkIGluIFN0cmluZyBWYWxpZCAopzMuMTQuNCkuIgorCSogcmVwcmVzZW50YXRpb24gb2YgaXRzIHZhbHVlIG11c3QgYmUg77+9dmFsaWTvv70gd2l0aCByZXNwZWN0CisJKiB0byB0aGUge3R5cGUgZGVmaW5pdGlvbn0gYXMgZGVmaW5lZCBpbiBTdHJpbmcgVmFsaWQgKO+/vTMuMTQuNCkuIgogCSogVE9ETzogRG9uJ3QgY2FyZSBhYm91dCB0aGUgKmNvbm9uaWNhbCogc3R1ZmYgaGVyZSwgdGhpcyByZXF1aXJlbWVudAogCSogd2lsbCBiZSByZW1vdmVkIGluIFdYUyAxLjEgYW55d2F5LgogCSovCkBAIC0xOTQ0MSw3ICsxOTQ0NSw3IEBACiAJICAgIHJldHVybihwY3R4dC0+ZXJyKTsKIAl9CiAgICAgfQotICAgCisKICAgICByZXR1cm4oMCk7CiB9CiAKQEAgLTE5NDg3LDE1ICsxOTQ5MSwxNSBAQAogICAgIC8qCiAgICAgKiBTUEVDICgxKSAiVGhlIHZhbHVlcyBvZiB0aGUgcHJvcGVydGllcyBvZiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uCiAgICAgKiBtdXN0IGJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgcHJvcGVydHkgdGFibGVhdSBpbiBUaGUgRWxlbWVudAotICAgICogRGVjbGFyYXRpb24gU2NoZW1hIENvbXBvbmVudCAopzMuMy4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YgTWlzc2luZwotICAgICogU3ViLWNvbXBvbmVudHMgKKc1LjMpLiIKKyAgICAqIERlY2xhcmF0aW9uIFNjaGVtYSBDb21wb25lbnQgKO+/vTMuMy4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YgTWlzc2luZworICAgICogU3ViLWNvbXBvbmVudHMgKO+/vTUuMykuIgogICAgICovCiAgICAgaWYgKFdYU19TVUJTVF9IRUFEKGVsZW1EZWNsKSAhPSBOVUxMKSB7CiAJeG1sU2NoZW1hRWxlbWVudFB0ciBoZWFkID0gV1hTX1NVQlNUX0hFQUQoZWxlbURlY2wpLCBjaXJjOwogCiAJeG1sU2NoZW1hQ2hlY2tFbGVtZW50RGVjbENvbXBvbmVudChoZWFkLCBwY3R4dCk7CiAJLyoKLQkqIFNQRUMgKDMpICJJZiB0aGVyZSBpcyBhIG5vbi23YWJzZW50tyB7c3Vic3RpdHV0aW9uIGdyb3VwCisJKiBTUEVDICgzKSAiSWYgdGhlcmUgaXMgYSBub24t77+9YWJzZW5077+9IHtzdWJzdGl0dXRpb24gZ3JvdXAKIAkqIGFmZmlsaWF0aW9ufSwgdGhlbiB7c2NvcGV9IG11c3QgYmUgZ2xvYmFsLiIKIAkqLwogCWlmICgoZWxlbURlY2wtPmZsYWdzICYgWE1MX1NDSEVNQVNfRUxFTV9HTE9CQUwpID09IDApIHsKQEAgLTE5NTM5LDkgKzE5NTQzLDkgQEAKIAkqIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIG11c3QgYmUgdmFsaWRseSBkZXJpdmVkIGZyb20gdGhlIHt0eXBlCiAJKiBkZWZpbml0aW9ufSBvZiB0aGUge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0sIGdpdmVuIHRoZSB2YWx1ZQogCSogb2YgdGhlIHtzdWJzdGl0dXRpb24gZ3JvdXAgZXhjbHVzaW9uc30gb2YgdGhlIHtzdWJzdGl0dXRpb24gZ3JvdXAKLQkqIGFmZmlsaWF0aW9ufSwgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKENvbXBsZXgpICinMy40LjYpCisJKiBhZmZpbGlhdGlvbn0sIGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChDb21wbGV4KSAo77+9My40LjYpCiAJKiAoaWYgdGhlIHt0eXBlIGRlZmluaXRpb259IGlzIGNvbXBsZXgpIG9yIGFzIGRlZmluZWQgaW4KLQkqIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNikgKGlmIHRoZSB7dHlwZSBkZWZpbml0aW9ufSBpcworCSogVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICjvv70zLjE0LjYpIChpZiB0aGUge3R5cGUgZGVmaW5pdGlvbn0gaXMKIAkqIHNpbXBsZSkuIgogCSoKIAkqIE5PVEU6IHtzdWJzdGl0dXRpb24gZ3JvdXAgZXhjbHVzaW9uc30gbWVhbnMgdGhlIHZhbHVlcyBvZiB0aGUKQEAgLTE5NjA1LDkgKzE5NjA5LDkgQEAKIAogCS8qCiAJKiBTUEVDICgyKSAiSWYgdGhlcmUgaXMgYSB7dmFsdWUgY29uc3RyYWludH0sIHRoZSBjYW5vbmljYWwgbGV4aWNhbAotCSogcmVwcmVzZW50YXRpb24gb2YgaXRzIHZhbHVlIG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QgdG8gdGhlCisJKiByZXByZXNlbnRhdGlvbiBvZiBpdHMgdmFsdWUgbXVzdCBiZSDvv712YWxpZO+/vSB3aXRoIHJlc3BlY3QgdG8gdGhlCiAJKiB7dHlwZSBkZWZpbml0aW9ufSBhcyBkZWZpbmVkIGluIEVsZW1lbnQgRGVmYXVsdCBWYWxpZCAoSW1tZWRpYXRlKQotCSogKKczLjMuNikuIgorCSogKO+/vTMuMy42KS4iCiAJKi8KIAlpZiAodHlwZURlZiA9PSBOVUxMKSB7CiAJICAgIHhtbFNjaGVtYVBFcnIocGN0eHQsIGVsZW1EZWNsLT5ub2RlLApAQCAtMTk2NzUsNyArMTk2NzksNyBAQAogCS8qCiAJKiBTUEVDICgyKSAiSXQgaXMgdmFsaWRseSBzdWJzdGl0dXRhYmxlIGZvciBIRUFEIHN1YmplY3QgdG8gSEVBRCdzCiAJKiB7ZGlzYWxsb3dlZCBzdWJzdGl0dXRpb25zfSBhcyB0aGUgYmxvY2tpbmcgY29uc3RyYWludCwgYXMgZGVmaW5lZCBpbgotCSogU3Vic3RpdHV0aW9uIEdyb3VwIE9LIChUcmFuc2l0aXZlKSAopzMuMy42KS4iCisJKiBTdWJzdGl0dXRpb24gR3JvdXAgT0sgKFRyYW5zaXRpdmUpICjvv70zLjMuNikuIgogCSovCiAJZm9yIChoZWFkID0gV1hTX1NVQlNUX0hFQUQoZWxlbURlY2wpOyBoZWFkICE9IE5VTEw7CiAJICAgIGhlYWQgPSBXWFNfU1VCU1RfSEVBRChoZWFkKSkgewpAQCAtMTk3NjcsMTIgKzE5NzcxLDEyIEBACiAgKiBAY3R4dFBhcnRpY2xlOiB0aGUgZmlyc3QgcGFydGljbGUgb2YgdGhlIGNvbnRleHQgY29tcG9uZW50CiAgKiBAc2VhcmNoUGFydGljbGU6IHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIHRvIGJlIGFuYWx5c2VkCiAgKgotICogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFbGVtZW50IERlY2xhcmF0aW9ucyBDb25zaXN0ZW50IAorICogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFbGVtZW50IERlY2xhcmF0aW9ucyBDb25zaXN0ZW50CiAgKi8KIHN0YXRpYyBpbnQKIHhtbFNjaGVtYUNoZWNrRWxlbWVudERlY2xDb25zaXN0ZW50KHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgcGN0eHQsCiAJCQkJICAgIHhtbFNjaGVtYUJhc2ljSXRlbVB0ciBjdHh0Q29tcG9uZW50LAotCQkJCSAgICB4bWxTY2hlbWFQYXJ0aWNsZVB0ciBjdHh0UGFydGljbGUsCQkJCSAgICAKKwkJCQkgICAgeG1sU2NoZW1hUGFydGljbGVQdHIgY3R4dFBhcnRpY2xlLAogCQkJCSAgICB4bWxTY2hlbWFQYXJ0aWNsZVB0ciBzZWFyY2hQYXJ0aWNsZSwKIAkJCQkgICAgeG1sU2NoZW1hUGFydGljbGVQdHIgY3VyUGFydGljbGUsCiAJCQkJICAgIGludCBzZWFyY2gpCkBAIC0xOTc4MSw3ICsxOTc4NSw3IEBACiAKICAgICBpbnQgcmV0ID0gMDsKICAgICB4bWxTY2hlbWFQYXJ0aWNsZVB0ciBjdXIgPSBjdXJQYXJ0aWNsZTsKLSAgICBpZiAoY3VyUGFydGljbGUgPT0gTlVMTCkgewkKKyAgICBpZiAoY3VyUGFydGljbGUgPT0gTlVMTCkgewogCXJldHVybigwKTsKICAgICB9CiAgICAgaWYgKFdYU19QQVJUSUNMRV9URVJNKGN1clBhcnRpY2xlKSA9PSBOVUxMKSB7CkBAIC0xOTc5MCw3ICsxOTc5NCw3IEBACiAJKiBtaWdodCBhcmlzZSBkdWUgdG8gYW4gaW52YWxpZCAidGVybSIgY29tcG9uZW50LgogCSovCiAJcmV0dXJuKDApOwotICAgIH0gICAgCisgICAgfQogICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewogCXN3aXRjaCAoV1hTX1BBUlRJQ0xFX1RFUk0oY3VyKS0+dHlwZSkgewogCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9BTlk6CkBAIC0xOTgwMCw3ICsxOTgwNCw3IEBACiAJCSAgICByZXQgPSB4bWxTY2hlbWFDaGVja0VsZW1lbnREZWNsQ29uc2lzdGVudChwY3R4dCwKIAkJCWN0eHRDb21wb25lbnQsIGN0eHRQYXJ0aWNsZSwgY3VyLCBjdHh0UGFydGljbGUsIDEpOwogCQkgICAgaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuKHJldCk7CQkgICAgCisJCQlyZXR1cm4ocmV0KTsKIAkJfSBlbHNlIHsKIAkJICAgIHhtbFNjaGVtYUVsZW1lbnRQdHIgZWxlbSA9CiAJCQlXWFNfRUxFTV9DQVNUKFdYU19QQVJUSUNMRV9URVJNKGN1cikpOwpAQCAtMTk4MDgsNyArMTk4MTIsNyBAQAogCQkgICAgKiBTUEVDIEVsZW1lbnQgRGVjbGFyYXRpb25zIENvbnNpc3RlbnQ6CiAJCSAgICAqICJJZiB0aGUge3BhcnRpY2xlc30gY29udGFpbnMsIGVpdGhlciBkaXJlY3RseSwKIAkJICAgICogaW5kaXJlY3RseSAodGhhdCBpcywgd2l0aGluIHRoZSB7cGFydGljbGVzfSBvZiBhCi0JCSAgICAqIGNvbnRhaW5lZCBtb2RlbCBncm91cCwgcmVjdXJzaXZlbHkpIG9yILdpbXBsaWNpdGx5tworCQkgICAgKiBjb250YWluZWQgbW9kZWwgZ3JvdXAsIHJlY3Vyc2l2ZWx5KSBvciDvv71pbXBsaWNpdGx577+9CiAJCSAgICAqIHR3byBvciBtb3JlIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGVzIHdpdGgKIAkJICAgICogdGhlIHNhbWUge25hbWV9IGFuZCB7dGFyZ2V0IG5hbWVzcGFjZX0sIHRoZW4KIAkJICAgICogYWxsIHRoZWlyIHR5cGUgZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZQpAQCAtMTk4MjAsNyArMTk4MjQsNyBAQAogCQkJICAgIFdYU19QQVJUSUNMRV9URVJNX0FTX0VMRU0oc2VhcmNoUGFydGljbGUpLT50YXJnZXROYW1lc3BhY2UpKQogCQkgICAgewogCQkJeG1sQ2hhciAqc3RyQSA9IE5VTEwsICpzdHJCID0gTlVMTDsKLQkJCQorCiAJCQl4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJCSAgICAvKiBUT0RPOiBlcnJvciBjb2RlICovCiAJCQkgICAgWE1MX1NDSEVNQVBfQ09TX05PTkFNQklHLApAQCAtMTk4MzcsMTYgKzE5ODQxLDE2IEBACiAJCQlGUkVFX0FORF9OVUxMKHN0ckIpOwogCQkJcmV0dXJuKFhNTF9TQ0hFTUFQX0NPU19OT05BTUJJRyk7CiAJCSAgICB9Ci0JCX0JICAgIAorCQl9CiAJCWJyZWFrOwotCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9TRVFVRU5DRTogewkJCisJICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX1NFUVVFTkNFOiB7CiAJCWJyZWFrOwogCQl9CiAJICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0NIT0lDRTp7CiAJCS8qCiAJCXhtbFNjaGVtYVRyZWVJdGVtUHRyIHN1YjsKLQkJCi0JCXN1YiA9IFdYU19QQVJUSUNMRV9URVJNKHBhcnRpY2xlKS0+Y2hpbGRyZW47ICAoeG1sU2NoZW1hUGFydGljbGVQdHIpIAorCisJCXN1YiA9IFdYU19QQVJUSUNMRV9URVJNKHBhcnRpY2xlKS0+Y2hpbGRyZW47ICAoeG1sU2NoZW1hUGFydGljbGVQdHIpCiAJCXdoaWxlIChzdWIgIT0gTlVMTCkgewogCQkgICAgcmV0ID0geG1sU2NoZW1hQ2hlY2tFbGVtZW50RGVjbENvbnNpc3RlbnQocGN0eHQsIGN0eHRDb21wb25lbnQsCiAJCQljdHh0UGFydGljbGUsIGN0eHRFbGVtKTsKQEAgLTE5ODgzLDcgKzE5ODg3LDcgQEAKICAqIEBuYW1lOiAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQogICoKICAqIFZhbGlkYXRlcyB0aGUgdmFsdWUgY29uc3RyYWludHMgb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAqIEFkZHMgc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMuIAorICogQWRkcyBzdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycy4KICAqLwogc3RhdGljIHZvaWQKIHhtbFNjaGVtYUNoZWNrRWxlbWVudERlY2xDb21wb25lbnQoeG1sU2NoZW1hRWxlbWVudFB0ciBlbGVtRGVjbCwKQEAgLTE5ODk4LDcgKzE5OTAyLDcgQEAKIAkvKgogCSogQWRkcyBzdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycy4KIAkqLwotCXhtbFNjaGVtYUNoZWNrRWxlbVN1YnN0R3JvdXAoY3R4dCwgZWxlbURlY2wpOwkKKwl4bWxTY2hlbWFDaGVja0VsZW1TdWJzdEdyb3VwKGN0eHQsIGVsZW1EZWNsKTsKICAgICB9CiB9CiAKQEAgLTE5OTI4LDcgKzE5OTMyLDcgQEAKIAkJWE1MX1NDSEVNQV9FWFRSQV9RTkFNRVJFRikpCiAJewogCSAgICBnb3RvIG5leHRfcGFydGljbGU7Ci0JfSAKKwl9CiAJcmVmID0gV1hTX1FOQU1FX0NBU1QgV1hTX1BBUlRJQ0xFX1RFUk0ocGFydGljbGUpOwogCS8qCiAJKiBSZXNvbHZlIHRoZSByZWZlcmVuY2UuCkBAIC0xOTk0NCw3ICsxOTk0OCw3IEBACiAJCXJlZi0+dGFyZ2V0TmFtZXNwYWNlLCByZWYtPml0ZW1UeXBlLCBOVUxMKTsKIAkgICAgLyogVE9ETzogcmVtb3ZlIHRoZSBwYXJ0aWNsZS4gKi8KIAkgICAgZ290byBuZXh0X3BhcnRpY2xlOwotCX0gCisJfQogCWlmIChyZWZJdGVtLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9HUk9VUCkgewogCSAgICBpZiAoV1hTX01PREVMR1JPVVBERUZfTU9ERUwocmVmSXRlbSkgPT0gTlVMTCkKIAkJLyogVE9ETzogcmVtb3ZlIHRoZSBwYXJ0aWNsZS4gKi8KQEAgLTE5OTk0LDkgKzE5OTk4LDkgQEAKIAogc3RhdGljIGludAogeG1sU2NoZW1hQXJlVmFsdWVzRXF1YWwoeG1sU2NoZW1hVmFsUHRyIHgsCi0JCSAgICAgICB4bWxTY2hlbWFWYWxQdHIgeSkgCi17ICAgCi0gICAgeG1sU2NoZW1hVHlwZVB0ciB0eCwgdHksIHB0eCwgcHR5OyAgICAKKwkJICAgICAgIHhtbFNjaGVtYVZhbFB0ciB5KQoreworICAgIHhtbFNjaGVtYVR5cGVQdHIgdHgsIHR5LCBwdHgsIHB0eTsKICAgICBpbnQgcmV0OwogCiAgICAgd2hpbGUgKHggIT0gTlVMTCkgewpAQCAtMjAwMDYsMTIgKzIwMDEwLDEyIEBACiAJcHR4ID0geG1sU2NoZW1hR2V0UHJpbWl0aXZlVHlwZSh0eCk7CiAJcHR5ID0geG1sU2NoZW1hR2V0UHJpbWl0aXZlVHlwZSh0eSk7CiAJLyoKLQkqICgxKSBpZiBhIGRhdGF0eXBlIFQnIGlzILdkZXJpdmVktyBieSC3cmVzdHJpY3Rpb263IGZyb20gYW4KLQkqIGF0b21pYyBkYXRhdHlwZSBUIHRoZW4gdGhlILd2YWx1ZSBzcGFjZbcgb2YgVCcgaXMgYSBzdWJzZXQgb2YKLQkqIHRoZSC3dmFsdWUgc3BhY2W3IG9mIFQuICovCisJKiAoMSkgaWYgYSBkYXRhdHlwZSBUJyBpcyDvv71kZXJpdmVk77+9IGJ5IO+/vXJlc3RyaWN0aW9u77+9IGZyb20gYW4KKwkqIGF0b21pYyBkYXRhdHlwZSBUIHRoZW4gdGhlIO+/vXZhbHVlIHNwYWNl77+9IG9mIFQnIGlzIGEgc3Vic2V0IG9mCisJKiB0aGUg77+9dmFsdWUgc3BhY2Xvv70gb2YgVC4gKi8KIAkvKgotCSogKDIpIGlmIGRhdGF0eXBlcyBUJyBhbmQgVCcnIGFyZSC3ZGVyaXZlZLcgYnkgt3Jlc3RyaWN0aW9utwotCSogZnJvbSBhIGNvbW1vbiBhdG9taWMgYW5jZXN0b3IgVCB0aGVuIHRoZSC3dmFsdWUgc3BhY2W3cyBvZiBUJworCSogKDIpIGlmIGRhdGF0eXBlcyBUJyBhbmQgVCcnIGFyZSDvv71kZXJpdmVk77+9IGJ5IO+/vXJlc3RyaWN0aW9u77+9CisJKiBmcm9tIGEgY29tbW9uIGF0b21pYyBhbmNlc3RvciBUIHRoZW4gdGhlIO+/vXZhbHVlIHNwYWNl77+9cyBvZiBUJwogCSogYW5kIFQnJyBtYXkgb3ZlcmxhcC4KIAkqLwogCWlmIChwdHggIT0gcHR5KQpAQCAtMjAwNDIsNyArMjAwNDYsNyBAQAogCWlmICh4ICE9IE5VTEwpIHsKIAkgICAgeSA9IHhtbFNjaGVtYVZhbHVlR2V0TmV4dCh5KTsKIAkgICAgaWYgKHkgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsJICAgIAorCQlyZXR1cm4gKDApOwogCX0gZWxzZSBpZiAoeG1sU2NoZW1hVmFsdWVHZXROZXh0KHkpICE9IE5VTEwpCiAJICAgIHJldHVybiAoMCk7CiAJZWxzZQpAQCAtMjAwOTIsMTEgKzIwMDk2LDExIEBACiAvKioKICAqIHhtbFNjaGVtYUNoZWNrQXR0clVzZVByb3BzQ29ycmVjdDoKICAqIEBjdHh0OiAgYSBwYXJzZXIgY29udGV4dAotICogQHVzZTogIGFuIGF0dHJpYnV0ZSB1c2UgCisgKiBAdXNlOiAgYW4gYXR0cmlidXRlIHVzZQogICoKICAqIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDoKICAqIEF0dHJpYnV0ZSBVc2UgQ29ycmVjdCAoYXUtcHJvcHMtY29ycmVjdCkKLSAqIAorICoKICAqLwogc3RhdGljIGludAogeG1sU2NoZW1hQ2hlY2tBdHRyVXNlUHJvcHNDb3JyZWN0KHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKQEAgLTIwMTA2LDE2ICsyMDExMCwxNiBAQAogCXJldHVybigtMSk7CiAgICAgaWYgKCh1c2UtPmRlZlZhbHVlID09IE5VTEwpIHx8IChXWFNfQVRUUlVTRV9ERUNMKHVzZSkgPT0gTlVMTCkgfHwKIAkoKFdYU19BVFRSVVNFX0RFQ0wodXNlKSktPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURSkpCi0JcmV0dXJuKDApOwkKKwlyZXR1cm4oMCk7CiAKICAgICAvKgogICAgICogU1BFQyBhdS1wcm9wcy1jb3JyZWN0ICgxKQogICAgICogIlRoZSB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgb2YgYW4gYXR0cmlidXRlIHVzZSBtdXN0IGJlIGFzCiAgICAgKiBkZXNjcmliZWQgaW4gdGhlIHByb3BlcnR5IHRhYmxlYXUgaW4gVGhlIEF0dHJpYnV0ZSBVc2UgU2NoZW1hCi0gICAgKiBDb21wb25lbnQgKKczLjUuMSksIG1vZHVsbyB0aGUgaW1wYWN0IG9mIE1pc3NpbmcKLSAgICAqIFN1Yi1jb21wb25lbnRzICinNS4zKS4iCisgICAgKiBDb21wb25lbnQgKO+/vTMuNS4xKSwgbW9kdWxvIHRoZSBpbXBhY3Qgb2YgTWlzc2luZworICAgICogU3ViLWNvbXBvbmVudHMgKO+/vTUuMykuIgogICAgICovCi0gICAgCisKICAgICBpZiAoKChXWFNfQVRUUlVTRV9ERUNMKHVzZSkpLT5kZWZWYWx1ZSAhPSBOVUxMKSAmJgogCSgoV1hTX0FUVFJVU0VfREVDTCh1c2UpKS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19BVFRSX0ZJWEVEKSAmJgogICAgICAgICAoKHVzZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BX0FUVFJfVVNFX0ZJWEVEKSA9PSAwKSkKQEAgLTIwMTM1LDcgKzIwMTM5LDcgQEAKICAgICBpZiAoKHVzZS0+ZGVmVmFsICE9IE5VTEwpICYmIChXWFNfQVRUUlVTRV9UWVBFREVGKHVzZSkgIT0gTlVMTCkpIHsKIAlpbnQgcmV0OwogCS8qCi0JKiBUT0RPOiBUaGUgc3BlYyBzZWVtcyB0byBiZSBtaXNzaW5nIGEgY2hlY2sgb2YgdGhlIAorCSogVE9ETzogVGhlIHNwZWMgc2VlbXMgdG8gYmUgbWlzc2luZyBhIGNoZWNrIG9mIHRoZQogCSogdmFsdWUgY29uc3RyYWludCBvZiB0aGUgYXR0cmlidXRlIHVzZS4gV2Ugd2lsbCBkbyBpdCBoZXJlLgogCSovCiAJLyoKQEAgLTIwMTUyLDcgKzIwMTU2LDcgQEAKIAkJTlVMTCwgTlVMTCk7CiAJICAgIHJldHVybihjdHh0LT5lcnIpOwogCX0KLQkKKwogCXJldCA9IHhtbFNjaGVtYVZDaGVja0NWQ1NpbXBsZVR5cGUoQUNUWFRfQ0FTVCBjdHh0LAogCSAgICB1c2UtPm5vZGUsIFdYU19BVFRSVVNFX1RZUEVERUYodXNlKSwKIAkgICAgdXNlLT5kZWZWYWx1ZSwgJih1c2UtPmRlZlZhbCksCkBAIC0yMDIwMyw3ICsyMDIwNyw3IEBACiAvKioKICAqIHhtbFNjaGVtYVJlc29sdmVBdHRyVHlwZVJlZmVyZW5jZXM6CiAgKiBAaXRlbTogIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotICogQGN0eHQ6ICBhIHBhcnNlciBjb250ZXh0IAorICogQGN0eHQ6ICBhIHBhcnNlciBjb250ZXh0CiAgKgogICogUmVzb2x2ZXMgdGhlIHJlZmVyZW5jZWQgdHlwZSBkZWZpbml0aW9uIGNvbXBvbmVudC4KICAqLwpAQCAtMjAyMTQsOCArMjAyMTgsOCBAQAogICAgIC8qCiAgICAgKiBUaGUgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSA8c2ltcGxlVHlwZT4gZWxlbWVudAogICAgICogaW5mb3JtYXRpb24gaXRlbSBpbiB0aGUgW2NoaWxkcmVuXSwgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBzaW1wbGUKLSAgICAqIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgdHlwZQotICAgICogW2F0dHJpYnV0ZV0sIGlmIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgt3NpbXBsZSB1ci10eXBlIGRlZmluaXRpb263LgorICAgICogdHlwZSBkZWZpbml0aW9uIO+/vXJlc29sdmVk77+9IHRvIGJ5IHRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2YgdGhlIHR5cGUKKyAgICAqIFthdHRyaWJ1dGVdLCBpZiBwcmVzZW50LCBvdGhlcndpc2UgdGhlIO+/vXNpbXBsZSB1ci10eXBlIGRlZmluaXRpb27vv70uCiAgICAgKi8KICAgICBpZiAoaXRlbS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19BVFRSX0lOVEVSTkFMX1JFU09MVkVEKQogCXJldHVybigwKTsKQEAgLTIwMjk0LDcgKzIwMjk4LDcgQEAKIAkJKCh4bWxTY2hlbWFJRENQdHIpIGlkYy0+cmVmLT5pdGVtKS0+bmJGaWVsZHMpIHsKIAkJeG1sQ2hhciAqc3RyID0gTlVMTDsKIAkJeG1sU2NoZW1hSURDUHRyIHJlZmVyOwotCQkKKwogCQlyZWZlciA9ICh4bWxTY2hlbWFJRENQdHIpIGlkYy0+cmVmLT5pdGVtOwogCQkvKgogCQkqIFNQRUMgYy1wcm9wcy1jb3JyZWN0KDIpCkBAIC0yMDM1Myw3ICsyMDM1Nyw3IEBACiAgICAgaW50IHdhc1JlZGVmaW5lZDsKIAogICAgIGlmIChyZWRlZiA9PSBOVUxMKQotCXJldHVybigwKTsgICAJCisJcmV0dXJuKDApOwogCiAgICAgZG8gewogCWl0ZW0gPSByZWRlZi0+aXRlbTsKQEAgLTIwMzY4LDcgKzIwMzcyLDcgQEAKIAkqICAgPHJlZGVmaW5lPmQgc2NoZW1hLiBDdXJyZW5sdHkgd2UgbGF0dGVyIGFwcHJvYWNoIGlzIHVzZWQuCiAJKiAgIFNVUFBMRU1FTlQ6IEl0IHNlZW1zIHRoYXQgdGhlIFdHIG1vdmVzIHRvd2FyZHMgdGhlIGxhdHRlcgogCSogICBhcHByb2FjaCwgc28gd2UgYXJlIGRvaW5nIGl0IHJpZ2h0LgotCSogICAKKwkqCiAJKi8KIAlwcmV2ID0geG1sU2NoZW1hRmluZFJlZGVmQ29tcEluR3JhcGgoCiAJICAgIHJlZGVmLT50YXJnZXRCdWNrZXQsIGl0ZW0tPnR5cGUsCkBAIC0yMDM3OSwxMSArMjAzODMsMTEgQEAKIAogCSAgICAvKgogCSAgICAqIFNQRUMgc3JjLXJlZGVmaW5lOgotCSAgICAqICg2LjIuMSkgIlRoZSC3YWN0dWFsIHZhbHVltyBvZiBpdHMgb3duIG5hbWUgYXR0cmlidXRlIHBsdXMKLQkgICAgKiB0YXJnZXQgbmFtZXNwYWNlIG11c3Qgc3VjY2Vzc2Z1bGx5ILdyZXNvbHZltyB0byBhIG1vZGVsCisJICAgICogKDYuMi4xKSAiVGhlIO+/vWFjdHVhbCB2YWx1Ze+/vSBvZiBpdHMgb3duIG5hbWUgYXR0cmlidXRlIHBsdXMKKwkgICAgKiB0YXJnZXQgbmFtZXNwYWNlIG11c3Qgc3VjY2Vzc2Z1bGx5IO+/vXJlc29sdmXvv70gdG8gYSBtb2RlbAogCSAgICAqIGdyb3VwIGRlZmluaXRpb24gaW4gSS4iCi0JICAgICogKDcuMi4xKSAiVGhlILdhY3R1YWwgdmFsdWW3IG9mIGl0cyBvd24gbmFtZSBhdHRyaWJ1dGUgcGx1cwotCSAgICAqIHRhcmdldCBuYW1lc3BhY2UgbXVzdCBzdWNjZXNzZnVsbHkgt3Jlc29sdmW3IHRvIGFuIGF0dHJpYnV0ZQorCSAgICAqICg3LjIuMSkgIlRoZSDvv71hY3R1YWwgdmFsdWXvv70gb2YgaXRzIG93biBuYW1lIGF0dHJpYnV0ZSBwbHVzCisJICAgICogdGFyZ2V0IG5hbWVzcGFjZSBtdXN0IHN1Y2Nlc3NmdWxseSDvv71yZXNvbHZl77+9IHRvIGFuIGF0dHJpYnV0ZQogCSAgICAqIGdyb3VwIGRlZmluaXRpb24gaW4gSS4iCiAKIAkgICAgKgpAQCAtMjA0MDAsNyArMjA0MDQsNyBAQAogCQkvKgogCQkqIFRPRE86IGVycm9yIGNvZGUuCiAJCSogUHJvYmFibHkgWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsIGlmIHRoaXMgaXMgdXNpbmcgdGhlCi0JCSogcmVmZXJlbmNlIGtpbmQuCQkKKwkJKiByZWZlcmVuY2Uga2luZC4KIAkJKi8KIAkJWE1MX1NDSEVNQVBfU1JDX1JFREVGSU5FLCBub2RlLCBOVUxMLAogCQkiVGhlICVzICclcycgdG8gYmUgcmVkZWZpbmVkIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiAiCkBAIC0yMDQwOCw3ICsyMDQxMiw3IEBACiAJCVdYU19JVEVNX1RZUEVfTkFNRShpdGVtKSwKIAkJeG1sU2NoZW1hRm9ybWF0UU5hbWUoJnN0ciwgcmVkZWYtPnJlZlRhcmdldE5zLAogCQkgICAgcmVkZWYtPnJlZk5hbWUpKTsKLQkgICAgRlJFRV9BTkRfTlVMTChzdHIpOwkgICAgCisJICAgIEZSRUVfQU5EX05VTEwoc3RyKTsKIAkgICAgZXJyID0gcGN0eHQtPmVycjsKIAkgICAgcmVkZWYgPSByZWRlZi0+bmV4dDsKIAkgICAgY29udGludWU7CkBAIC0yMDQzNCw3ICsyMDQzOCw3IEBACiAJCSogYmFzZSB0eXBlIG9mIHRoZSByZWRlZmluaW5nIHR5cGUuCiAJCSogVE9ETzogSG93CiAJCSovCi0JCSgoeG1sU2NoZW1hVHlwZVB0cikgaXRlbSktPmJhc2VUeXBlID0gCisJCSgoeG1sU2NoZW1hVHlwZVB0cikgaXRlbSktPmJhc2VUeXBlID0KIAkJICAgICh4bWxTY2hlbWFUeXBlUHRyKSBwcmV2OwogCQlicmVhazsKIAkgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfR1JPVVA6CkBAIC0yMDQ4OSw3ICsyMDQ5Myw3IEBACiAJICAgIGRlZmF1bHQ6CiAJCVBFUlJPUl9JTlQoInhtbFNjaGVtYVJlc29sdmVSZWRlZlJlZmVyZW5jZXMiLAogCQkgICAgIlVuZXhwZWN0ZWQgcmVkZWZpbmVkIGNvbXBvbmVudCB0eXBlIik7Ci0JCXJldHVybigtMSk7CQorCQlyZXR1cm4oLTEpOwogCX0KIAlpZiAod2FzUmVkZWZpbmVkKSB7CiAJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CkBAIC0yMDQ5OSw3ICsyMDUwMyw3IEBACiAJCW5vZGUgPSBXWFNfSVRFTV9OT0RFKHJlZGVmLT5yZWZlcmVuY2UpOwogCSAgICBlbHNlCiAJCW5vZGUgPSBXWFNfSVRFTV9OT0RFKHJlZGVmLT5pdGVtKTsKLQkgICAgCisKIAkgICAgeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgcGN0eHQsCiAJCS8qIFRPRE86IGVycm9yIGNvZGUuICovCiAJCVhNTF9TQ0hFTUFQX1NSQ19SRURFRklORSwKQEAgLTIwNTA4LDEyICsyMDUxMiwxMiBAQAogCQkicmVkZWZpbml0aW9uIG9mIHRoZSBzYW1lIGNvbXBvbmVudCBpcyBub3Qgc3VwcG9ydGVkIiwKIAkJeG1sU2NoZW1hR2V0Q29tcG9uZW50RGVzaWduYXRpb24oJnN0ciwgcHJldiksCiAJCU5VTEwpOwotCSAgICBGUkVFX0FORF9OVUxMKHN0cikJICAgIAorCSAgICBGUkVFX0FORF9OVUxMKHN0cikKIAkgICAgZXJyID0gcGN0eHQtPmVycjsKIAkgICAgcmVkZWYgPSByZWRlZi0+bmV4dDsKIAkgICAgY29udGludWU7CiAJfQotCXJlZGVmID0gcmVkZWYtPm5leHQ7CQorCXJlZGVmID0gcmVkZWYtPm5leHQ7CiAgICAgfSB3aGlsZSAocmVkZWYgIT0gTlVMTCk7CiAKICAgICByZXR1cm4oZXJyKTsKQEAgLTIwNTI3LDcgKzIwNTMxLDcgQEAKICAgICB4bWxTY2hlbWFCYXNpY0l0ZW1QdHIgaXRlbTsKIAogICAgIGlmIChyZWRlZiA9PSBOVUxMKQotCXJldHVybigwKTsgICAJCisJcmV0dXJuKDApOwogCiAgICAgZG8gewogCWlmIChyZWRlZi0+dGFyZ2V0ID09IE5VTEwpIHsKQEAgLTIwNTM1LDcgKzIwNTM5LDcgQEAKIAkgICAgY29udGludWU7CiAJfQogCWl0ZW0gPSByZWRlZi0+aXRlbTsKLQkJCisKIAlzd2l0Y2ggKGl0ZW0tPnR5cGUpIHsKIAkgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFOgogCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9DT01QTEVYOgpAQCAtMjA1NDQsNyArMjA1NDgsNyBAQAogCQkqIHR5cGUgdG8gYmUgJ2Fic2VudCcsIHdlJ2xsIE5VTEwgaXQuCiAJCSovCiAJCShXWFNfVFlQRV9DQVNUIHJlZGVmLT50YXJnZXQpLT5uYW1lID0gTlVMTDsKLQkJCisKIAkJLyoKIAkJKiBUT0RPOiBTZWVtcyBsaWtlIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvLiBUaGUgbm9ybWFsCiAJCSogaW5oZXJpdGFuY2UgbWVjaGFuaXNtIGlzIHVzZWQuIEJ1dCBub3QgMTAwJSBzdXJlLgpAQCAtMjA1NTYsMTAgKzIwNTYwLDEwIEBACiAJCSogU1BFQyBzcmMtcmVkZWZpbmU6CiAJCSogKDYuMi4yKSAiVGhlIHttb2RlbCBncm91cH0gb2YgdGhlIG1vZGVsIGdyb3VwIGRlZmluaXRpb24KIAkJKiB3aGljaCBjb3JyZXNwb25kcyB0byBpdCBwZXIgWE1MIFJlcHJlc2VudGF0aW9uIG9mIE1vZGVsCi0JCSogR3JvdXAgRGVmaW5pdGlvbiBTY2hlbWEgQ29tcG9uZW50cyAopzMuNy4yKSBtdXN0IGJlIGEKLQkJKiC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSB7bW9kZWwgZ3JvdXB9IG9mIHRoYXQgbW9kZWwKKwkJKiBHcm91cCBEZWZpbml0aW9uIFNjaGVtYSBDb21wb25lbnRzICjvv70zLjcuMikgbXVzdCBiZSBhCisJCSog77+9dmFsaWQgcmVzdHJpY3Rpb27vv70gb2YgdGhlIHttb2RlbCBncm91cH0gb2YgdGhhdCBtb2RlbAogCQkqIGdyb3VwIGRlZmluaXRpb24gaW4gSSwgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBWYWxpZAotCQkqIChSZXN0cmljdGlvbikgKKczLjkuNikuIgorCQkqIChSZXN0cmljdGlvbikgKO+/vTMuOS42KS4iCiAJCSovCiAJCWJyZWFrOwogCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEVHUk9VUDoKQEAgLTIwNTY4LDExICsyMDU3MiwxMSBAQAogCQkqICg3LjIuMikgIlRoZSB7YXR0cmlidXRlIHVzZXN9IGFuZCB7YXR0cmlidXRlIHdpbGRjYXJkfSBvZgogCQkqIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiB3aGljaCBjb3JyZXNwb25kcyB0byBpdAogCQkqIHBlciBYTUwgUmVwcmVzZW50YXRpb24gb2YgQXR0cmlidXRlIEdyb3VwIERlZmluaXRpb24gU2NoZW1hCi0JCSogQ29tcG9uZW50cyAopzMuNi4yKSBtdXN0IGJlILd2YWxpZCByZXN0cmljdGlvbnO3IG9mIHRoZQorCQkqIENvbXBvbmVudHMgKO+/vTMuNi4yKSBtdXN0IGJlIO+/vXZhbGlkIHJlc3RyaWN0aW9uc++/vSBvZiB0aGUKIAkJKiB7YXR0cmlidXRlIHVzZXN9IGFuZCB7YXR0cmlidXRlIHdpbGRjYXJkfSBvZiB0aGF0IGF0dHJpYnV0ZQogCQkqIGdyb3VwIGRlZmluaXRpb24gaW4gSSwgYXMgZGVmaW5lZCBpbiBjbGF1c2UgMiwgY2xhdXNlIDMgYW5kCiAJCSogY2xhdXNlIDQgb2YgRGVyaXZhdGlvbiBWYWxpZCAoUmVzdHJpY3Rpb24sIENvbXBsZXgpCi0JCSogKKczLjQuNikgKHdoZXJlIHJlZmVyZW5jZXMgdG8gdGhlIGJhc2UgdHlwZSBkZWZpbml0aW9uIGFyZQorCQkqICjvv70zLjQuNikgKHdoZXJlIHJlZmVyZW5jZXMgdG8gdGhlIGJhc2UgdHlwZSBkZWZpbml0aW9uIGFyZQogCQkqIHVuZGVyc3Rvb2QgYXMgcmVmZXJlbmNlcyB0byB0aGUgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24KIAkJKiBpbiBJKS4iCiAJCSovCkBAIC0yMDU5Myw3ICsyMDU5Nyw3IEBACiAgICAgfSB3aGlsZSAocmVkZWYgIT0gTlVMTCk7CiAgICAgcmV0dXJuKDApOwogfQotCQorCiAKIHN0YXRpYyBpbnQKIHhtbFNjaGVtYUFkZENvbXBvbmVudHMoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBwY3R4dCwKQEAgLTIwNjI3LDggKzIwNjMxLDggQEAKIAlyZXR1cm4oLTEpOwogICAgIGlmIChidWNrZXQtPmZsYWdzICYgWE1MX1NDSEVNQV9CVUNLRVRfQ09NUFNfQURERUQpCiAJcmV0dXJuKDApOwotICAgIGJ1Y2tldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQV9CVUNLRVRfQ09NUFNfQURERUQ7IAotICAgIAorICAgIGJ1Y2tldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQV9CVUNLRVRfQ09NUFNfQURERUQ7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5nbG9iYWxzLT5uYkl0ZW1zOyBpKyspIHsKIAlpdGVtID0gYnVja2V0LT5nbG9iYWxzLT5pdGVtc1tpXTsKIAl0YWJsZSA9IE5VTEw7CkBAIC0yMDY2OSwxMiArMjA2NzMsMTIgQEAKIAkgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfTk9UQVRJT046CiAJCW5hbWUgPSAoKHhtbFNjaGVtYU5vdGF0aW9uUHRyKSBpdGVtKS0+bmFtZTsKIAkJV1hTX0dFVF9HTE9CQUxfSEFTSChidWNrZXQsIG5vdGFEZWNsKQotCQlicmVhazsJICAgIAorCQlicmVhazsKIAkgICAgZGVmYXVsdDoKIAkJUEVSUk9SX0lOVCgieG1sU2NoZW1hQWRkQ29tcG9uZW50cyIsCiAJCSAgICAiVW5leHBlY3RlZCBnbG9iYWwgY29tcG9uZW50IHR5cGUiKTsKLQkJY29udGludWU7ICAgIAkJCi0JfQkKKwkJY29udGludWU7CisJfQogCWlmICgqdGFibGUgPT0gTlVMTCkgewogCSAgICAqdGFibGUgPSB4bWxIYXNoQ3JlYXRlRGljdCgxMCwgcGN0eHQtPmRpY3QpOwogCSAgICBpZiAoKnRhYmxlID09IE5VTEwpIHsKQEAgLTIwNjgyLDExICsyMDY4NiwxMSBAQAogCQkgICAgImZhaWxlZCB0byBjcmVhdGUgYSBjb21wb25lbnQgaGFzaCB0YWJsZSIpOwogCQlyZXR1cm4oLTEpOwogCSAgICB9Ci0JfQkKKwl9CiAJZXJyID0geG1sSGFzaEFkZEVudHJ5KCp0YWJsZSwgbmFtZSwgaXRlbSk7Ci0JaWYgKGVyciAhPSAwKSB7CQorCWlmIChlcnIgIT0gMCkgewogCSAgICB4bWxDaGFyICpzdHIgPSBOVUxMOwotCSAgICAKKwogCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCBwY3R4dCwKIAkJWE1MX1NDSEVNQVBfUkVERUZJTkVEX1RZUEUsCiAJCVdYU19JVEVNX05PREUoaXRlbSksCkBAIC0yMDY5NCw3ICsyMDY5OCw3IEBACiAJCSJBIGdsb2JhbCAlcyAnJXMnIGRvZXMgYWxyZWFkeSBleGlzdCIsCiAJCVdYU19JVEVNX1RZUEVfTkFNRShpdGVtKSwKIAkJeG1sU2NoZW1hR2V0Q29tcG9uZW50UU5hbWUoJnN0ciwgaXRlbSkpOwotCSAgICBGUkVFX0FORF9OVUxMKHN0cik7CSAKKwkgICAgRlJFRV9BTkRfTlVMTChzdHIpOwogCX0KICAgICB9CiAgICAgLyoKQEAgLTIwNzI4LDM0ICsyMDczMiwzNCBAQAogCiAgICAgaWYgKChjb24tPnBlbmRpbmcgPT0gTlVMTCkgfHwKIAkoY29uLT5wZW5kaW5nLT5uYkl0ZW1zID09IDApKQotCXJldHVybigwKTsgICAgCisJcmV0dXJuKDApOwogCiAgICAgLyoKICAgICAqIFNpbmNlIHhtbFNjaGVtYUZpeHVwQ29tcGxleFR5cGUoKSB3aWxsIGNyZWF0ZSBuZXcgcGFydGljbGVzCiAgICAgKiAobG9jYWwgY29tcG9uZW50cyksIGFuZCB0aG9zZSBwYXJ0aWNsZSBjb21wb25lbnRzIG5lZWQgYSBidWNrZXQKICAgICAqIG9uIHRoZSBjb25zdHJ1Y3Rvciwgd2UnbGwgYXNzdXJlIGhlcmUgdGhhdCB0aGUgY29uc3RydWN0b3IgaGFzCiAgICAgKiBhIGJ1Y2tldC4KLSAgICAqIFRPRE86IFRoaW5rIGFib3V0IHN0b3JpbmcgbG9jYWxzIF9vbmx5XyBvbiB0aGUgbWFpbiBidWNrZXQuICAgIAotICAgICovICAgIAorICAgICogVE9ETzogVGhpbmsgYWJvdXQgc3RvcmluZyBsb2NhbHMgX29ubHlfIG9uIHRoZSBtYWluIGJ1Y2tldC4KKyAgICAqLwogICAgIGlmIChjb24tPmJ1Y2tldCA9PSBOVUxMKQotCWNvbi0+YnVja2V0ID0gcm9vdEJ1Y2tldDsgICAgCisJY29uLT5idWNrZXQgPSByb290QnVja2V0OwogCiAgICAgLyogVE9ETzoKICAgICAqIFNQRUMgKHNyYy1yZWRlZmluZSk6CiAgICAgKiAoNi4yKSAiSWYgaXQgaGFzIG5vIHN1Y2ggc2VsZi1yZWZlcmVuY2UsIHRoZW4gYWxsIG9mIHRoZQogICAgICogZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToiCi0gICAgCisKICAgICAqICg2LjIuMikgVGhlIHttb2RlbCBncm91cH0gb2YgdGhlIG1vZGVsIGdyb3VwIGRlZmluaXRpb24gd2hpY2gKICAgICAqIGNvcnJlc3BvbmRzIHRvIGl0IHBlciBYTUwgUmVwcmVzZW50YXRpb24gb2YgTW9kZWwgR3JvdXAKLSAgICAqIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudHMgKKczLjcuMikgbXVzdCBiZSBhILd2YWxpZAotICAgICogcmVzdHJpY3Rpb263IG9mIHRoZSB7bW9kZWwgZ3JvdXB9IG9mIHRoYXQgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbgotICAgICogaW4gSSwgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLiIKKyAgICAqIERlZmluaXRpb24gU2NoZW1hIENvbXBvbmVudHMgKO+/vTMuNy4yKSBtdXN0IGJlIGEg77+9dmFsaWQKKyAgICAqIHJlc3RyaWN0aW9u77+9IG9mIHRoZSB7bW9kZWwgZ3JvdXB9IG9mIHRoYXQgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbgorICAgICogaW4gSSwgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICjvv70zLjkuNikuIgogICAgICovCiAgICAgeG1sU2NoZW1hQ2hlY2tTUkNSZWRlZmluZUZpcnN0KHBjdHh0KTsKIAogICAgIC8qCiAgICAgKiBBZGQgZ2xvYmFsIGNvbXBvbmVudHMgdG8gdGhlIHNjaGVtYXRhJ3MgaGFzaCB0YWJsZXMuCi0gICAgKi8gICAgCisgICAgKi8KICAgICB4bWxTY2hlbWFBZGRDb21wb25lbnRzKHBjdHh0LCByb290QnVja2V0KTsKIAogICAgIHBjdHh0LT5jdHh0VHlwZSA9IE5VTEw7CkBAIC0yMDc2NSw3ICsyMDc2OSw3IEBACiAgICAgKiBOb3cgdGhhdCB3ZSBoYXZlIHBhcnNlZCAqYWxsKiB0aGUgc2NoZW1hIGRvY3VtZW50KHMpIGFuZCBjb252ZXJ0ZWQKICAgICAqIHRoZW0gdG8gc2NoZW1hIGNvbXBvbmVudHMsIHdlIGNhbiByZXNvbHZlIHJlZmVyZW5jZXMsIGFwcGx5IGNvbXBvbmVudAogICAgICogY29uc3RyYWludHMsIGNyZWF0ZSB0aGUgRlNBIGZyb20gdGhlIGNvbnRlbnQgbW9kZWwsIGV0Yy4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIC8qCiAgICAgKiBSZXNvbHZlIHJlZmVyZW5jZXMgb2YuLgogICAgICoKQEAgLTIwNzg2LDcgKzIwNzkwLDcgQEAKICAgICAqIDYuIElEQyBrZXktcmVmZXJlbmNlczoKICAgICAqICAgLSB0aGUgcmVmZXJlbmNlZCBJREMgJ2tleScgb3IgJ3VuaXF1ZScgZGVmaW5pdGlvbgogICAgICogNy4gQXR0cmlidXRlIHByb2hpYml0aW9ucyB3aGljaCBoYWQgYSAicmVmIiBhdHRyaWJ1dGUuCi0gICAgKi8gICAgICAgIAorICAgICovCiAgICAgZm9yIChpID0gMDsgaSA8IG5iSXRlbXM7IGkrKykgewogCWl0ZW0gPSBpdGVtc1tpXTsKIAlzd2l0Y2ggKGl0ZW0tPnR5cGUpIHsKQEAgLTIwODEyLDcgKzIwODE2LDcgQEAKIAkJRklYSEZBSUxVUkU7CiAJCWJyZWFrOwogCSAgICBjYXNlIFhNTF9TQ0hFTUFfRVhUUkFfUU5BTUVSRUY6Ci0JCWlmICgoV1hTX1FOQU1FX0NBU1QgaXRlbSktPml0ZW1UeXBlID09IAorCQlpZiAoKFdYU19RTkFNRV9DQVNUIGl0ZW0pLT5pdGVtVHlwZSA9PQogCQkgICAgWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURUdST1VQKQogCQl7CiAJCSAgICB4bWxTY2hlbWFSZXNvbHZlQXR0ckdyb3VwUmVmZXJlbmNlcygKQEAgLTIwODQ5LDExICsyMDg1MywxMSBAQAogICAgIH0KICAgICBpZiAocGN0eHQtPm5iZXJyb3JzICE9IDApCiAJZ290byBleGl0X2Vycm9yOwotICAgIAorCiAgICAgLyoKICAgICAqIE5vdyB0aGF0IGFsbCByZWZlcmVuY2VzIGFyZSByZXNvbHZlZCB3ZQogICAgICogY2FuIGNoZWNrIGZvciBjaXJjdWxhcml0eSBvZi4uLgotICAgICogMS4gdGhlIGJhc2UgYXhpcyBvZiB0eXBlIGRlZmluaXRpb25zIAorICAgICogMS4gdGhlIGJhc2UgYXhpcyBvZiB0eXBlIGRlZmluaXRpb25zCiAgICAgKiAyLiBuZXN0ZWQgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbnMKICAgICAqIDMuIG5lc3RlZCBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbnMKICAgICAqIFRPRE86IGNoZWNrIGZvciBjaXJjdWFsIHN1YnN0aXR1dGlvbiBncm91cHMuCkBAIC0yMDg4OCw3ICsyMDg5Miw3IEBACiAJCWJyZWFrOwogCSAgICBkZWZhdWx0OgogCQlicmVhazsKLQl9CQorCX0KICAgICB9CiAgICAgaWYgKHBjdHh0LT5uYmVycm9ycyAhPSAwKQogCWdvdG8gZXhpdF9lcnJvcjsKQEAgLTIwOTA0LDcgKzIwOTA4LDcgQEAKIAlpdGVtID0gaXRlbXNbaV07CiAJc3dpdGNoIChpdGVtLT50eXBlKSB7CiAJICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX1NFUVVFTkNFOgotCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9DSE9JQ0U6CQorCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9DSE9JQ0U6CiAJCXhtbFNjaGVtYU1vZGVsR3JvdXBUb01vZGVsR3JvdXBEZWZGaXh1cChwY3R4dCwKIAkJICAgIFdYU19NT0RFTF9HUk9VUF9DQVNUIGl0ZW0pOwogCQlicmVhazsKQEAgLTIwOTM1LDcgKzIwOTM5LDcgQEAKICAgICB9CiAgICAgaWYgKHBjdHh0LT5uYmVycm9ycyAhPSAwKQogCWdvdG8gZXhpdF9lcnJvcjsKLSAgICAvKiAKKyAgICAvKgogICAgICogRmlyc3QgY29tcHV0ZSB0aGUgdmFyaWV0eSBvZiBzaW1wbGUgdHlwZXMuIFRoaXMgaXMgbmVlZGVkIGFzCiAgICAgKiBhIHNlcGVyYXRlIHN0ZXAsIHNpbmNlIG90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIGRldGVjdAogICAgICogY2lyY3VsYXIgdW5pb24gdHlwZXMgaW4gYWxsIGNhc2VzLgpAQCAtMjA5NjUsNyArMjA5NjksNyBAQAogCXN3aXRjaCAoaXRlbS0+dHlwZSkgewogICAgICAgICAgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFOgogCQlpZiAoKCh4bWxTY2hlbWFUeXBlUHRyKSBpdGVtKS0+bWVtYmVyVHlwZXMgIT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hQ2hlY2tVbmlvblR5cGVEZWZDaXJjdWxhcihwY3R4dCwJCisJCSAgICB4bWxTY2hlbWFDaGVja1VuaW9uVHlwZURlZkNpcmN1bGFyKHBjdHh0LAogCQkJKHhtbFNjaGVtYVR5cGVQdHIpIGl0ZW0pOwogCQkgICAgRklYSEZBSUxVUkU7CiAJCX0KQEAgLTIwOTc2LDcgKzIwOTgwLDcgQEAKICAgICB9CiAgICAgaWYgKHBjdHh0LT5uYmVycm9ycyAhPSAwKQogCWdvdG8gZXhpdF9lcnJvcjsKLSAgICAKKwogICAgIC8qCiAgICAgKiBEbyB0aGUgY29tcGxldGUgdHlwZSBmaXh1cCBmb3Igc2ltcGxlIHR5cGVzLgogICAgICovCkBAIC0yMTAwNCwxMCArMjEwMDgsMTAgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbmJJdGVtczsgaSsrKSB7CiAJaXRlbSA9IGl0ZW1zW2ldOwogCXN3aXRjaCAoaXRlbS0+dHlwZSkgewotCSAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEU6CQkKKwkgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFOgogCQl4bWxTY2hlbWFDaGVja0F0dHJQcm9wc0NvcnJlY3QocGN0eHQsIFdYU19BVFRSX0NBU1QgaXRlbSk7CiAJCUZJWEhGQUlMVVJFOwotCQlicmVhazsJICAgIAorCQlicmVhazsKIAkgICAgZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjEwMTYsNyArMjEwMjAsNyBAQAogCWdvdG8gZXhpdF9lcnJvcjsKICAgICAvKgogICAgICogQXBwbHkgY29uc3RyYWludHMgZm9yIGF0dHJpYnV0ZSB1c2VzLgotICAgICovICAgIAorICAgICovCiAgICAgZm9yIChpID0gMDsgaSA8IG5iSXRlbXM7IGkrKykgewogCWl0ZW0gPSBpdGVtc1tpXTsKIAlzd2l0Y2ggKGl0ZW0tPnR5cGUpIHsKQEAgLTIxMDYzLDcgKzIxMDY3LDcgQEAKICAgICBpZiAocGN0eHQtPm5iZXJyb3JzICE9IDApCiAJZ290byBleGl0X2Vycm9yOwogCi0gICAgLyogICAgCisgICAgLyoKICAgICAqIENvbXBsZXggdHlwZXMgYXJlIGJ1aWxkZWQgYW5kIGNoZWNrZWQuCiAgICAgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgbmJJdGVtczsgaSsrKSB7CkBAIC0yMTA4Nyw4ICsyMTA5MSw4IEBACiAgICAgKiB3aWxsIGNyZWF0ZSBwYXJ0aWNsZXMgYW5kIG1vZGVsIGdyb3VwcyBpbiBzb21lIGNhc2VzLgogICAgICovCiAgICAgaXRlbXMgPSAoeG1sU2NoZW1hVHJlZUl0ZW1QdHIgKikgY29uLT5wZW5kaW5nLT5pdGVtczsKLSAgICBuYkl0ZW1zID0gY29uLT5wZW5kaW5nLT5uYkl0ZW1zOyAgICAKLSAgICAKKyAgICBuYkl0ZW1zID0gY29uLT5wZW5kaW5nLT5uYkl0ZW1zOworCiAgICAgLyoKICAgICAqIEFwcGx5IHNvbWUgY29uc3RyYWludHMgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgogICAgICovCkBAIC0yMTA5Nyw3ICsyMTEwMSw3IEBACiAJc3dpdGNoIChpdGVtLT50eXBlKSB7CiAJICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0VMRU1FTlQ6CiAJCWVsZW1EZWNsID0gKHhtbFNjaGVtYUVsZW1lbnRQdHIpIGl0ZW07Ci0JCQorCiAJCWlmICgoZWxlbURlY2wtPmZsYWdzICYgWE1MX1NDSEVNQVNfRUxFTV9JTlRFUk5BTF9DSEVDS0VEKSA9PSAwKQogCQl7CiAJCSAgICB4bWxTY2hlbWFDaGVja0VsZW1lbnREZWNsQ29tcG9uZW50KApAQCAtMjExMjcsNyArMjExMzEsNyBAQAogICAgIH0KICAgICBpZiAocGN0eHQtPm5iZXJyb3JzICE9IDApCiAJZ290byBleGl0X2Vycm9yOwotIAorCiAgICAgLyoKICAgICAqIEZpbmFsbHkgd2UgY2FuIGJ1aWxkIHRoZSBhdXRvbWF0b24gZnJvbSB0aGUgY29udGVudCBtb2RlbCBvZgogICAgICogY29tcGxleCB0eXBlcy4KQEAgLTIxMTQ4LDEwICsyMTE1MiwxMCBAQAogCWdvdG8gZXhpdF9lcnJvcjsKICAgICAvKgogICAgICogVVJHRU5UIFRPRE86IGNvcy1lbGVtZW50LWNvbnNpc3RlbnQKLSAgICAqLyAgICAgICAgCi0gICAgZ290byBleGl0OyAgICAKKyAgICAqLworICAgIGdvdG8gZXhpdDsKIAotZXhpdF9lcnJvcjogICAgCitleGl0X2Vycm9yOgogICAgIHJldCA9IHBjdHh0LT5lcnI7CiAgICAgZ290byBleGl0OwogCkBAIC0yMTE2NSwxMiArMjExNjksMTIgQEAKICAgICAqIGlmIG5vdCBjbGVhcmVkIGhlcmUuCiAgICAgKi8KICAgICBjb24tPmJ1Y2tldCA9IG9sZGJ1Y2tldDsKLSAgICBjb24tPnBlbmRpbmctPm5iSXRlbXMgPSAwOyAgICAKKyAgICBjb24tPnBlbmRpbmctPm5iSXRlbXMgPSAwOwogICAgIGlmIChjb24tPnN1YnN0R3JvdXBzICE9IE5VTEwpIHsKIAl4bWxIYXNoRnJlZShjb24tPnN1YnN0R3JvdXBzLAogCSAgICAoeG1sSGFzaERlYWxsb2NhdG9yKSB4bWxTY2hlbWFTdWJzdEdyb3VwRnJlZSk7CiAJY29uLT5zdWJzdEdyb3VwcyA9IE5VTEw7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgaWYgKGNvbi0+cmVkZWZzICE9IE5VTEwpIHsKIAl4bWxTY2hlbWFSZWRlZkxpc3RGcmVlKGNvbi0+cmVkZWZzKTsKIAljb24tPnJlZGVmcyA9IE5VTEw7CkBAIC0yMTIzMywxMSArMjEyMzcsMTEgQEAKICAgICBpZiAocmVzID09IC0xKQogCWdvdG8gZXhpdF9mYWlsdXJlOwogICAgIGlmIChyZXMgIT0gMCkKLQlnb3RvIGV4aXQ7ICAgCisJZ290byBleGl0OwogCiAgICAgaWYgKGJ1Y2tldCA9PSBOVUxMKSB7CiAJLyogVE9ETzogRXJyb3IgY29kZSwgYWN0dWFsbHkgd2UgZmFpbGVkIHRvICpsb2NhdGUqIHRoZSBzY2hlbWEuICovCi0JaWYgKGN0eHQtPlVSTCkgCisJaWYgKGN0eHQtPlVSTCkKIAkgICAgeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgY3R4dCwgWE1MX1NDSEVNQVBfRkFJTEVEX0xPQUQsCiAJCU5VTEwsIE5VTEwsCiAJCSJGYWlsZWQgdG8gbG9jYXRlIHRoZSBtYWluIHNjaGVtYSByZXNvdXJjZSBhdCAnJXMnIiwKQEAgLTIxMjQ4LDE2ICsyMTI1MiwxNiBAQAogCQkiRmFpbGVkIHRvIGxvY2F0ZSB0aGUgbWFpbiBzY2hlbWEgcmVzb3VyY2UiLAogCQkgICAgTlVMTCwgTlVMTCk7CiAJZ290byBleGl0OwotICAgIH0gICAgICAgIAorICAgIH0KICAgICAvKiBUaGVuIGRvIHRoZSBwYXJzaW5nIGZvciBnb29kLiAqLwogICAgIGlmICh4bWxTY2hlbWFQYXJzZU5ld0RvY1dpdGhDb250ZXh0KGN0eHQsIG1haW5TY2hlbWEsIGJ1Y2tldCkgPT0gLTEpCiAJZ290byBleGl0X2ZhaWx1cmU7CiAgICAgaWYgKGN0eHQtPm5iZXJyb3JzICE9IDApCiAJZ290byBleGl0OwotICAgIAorCiAgICAgbWFpblNjaGVtYS0+ZG9jID0gYnVja2V0LT5kb2M7CiAgICAgbWFpblNjaGVtYS0+cHJlc2VydmUgPSBjdHh0LT5wcmVzZXJ2ZTsKLSAgICAKKwogICAgIGN0eHQtPnNjaGVtYSA9IG1haW5TY2hlbWE7CiAKICAgICBpZiAoeG1sU2NoZW1hRml4dXBDb21wb25lbnRzKGN0eHQsIFdYU19DT05TVFJVQ1RPUihjdHh0KS0+bWFpbkJ1Y2tldCkgPT0gLTEpCkBAIC0yMTI2Nyw4ICsyMTI3MSw4IEBACiAgICAgKiBUT0RPOiBUaGlzIGlzIG5vdCBuaWNlLCBzaW5jZSB3ZSBjYW5ub3QgZGlzdGluZ3Vpc2ggZnJvbSB0aGUKICAgICAqIHJlc3VsdCBpZiB0aGVyZSB3YXMgYW4gaW50ZXJuYWwgZXJyb3Igb3Igbm90LgogICAgICovCi1leGl0OiAgICAgICAKLSAgICBpZiAoY3R4dC0+bmJlcnJvcnMgIT0gMCkgewkKK2V4aXQ6CisgICAgaWYgKGN0eHQtPm5iZXJyb3JzICE9IDApIHsKIAlpZiAobWFpblNjaGVtYSkgewogCSAgICB4bWxTY2hlbWFGcmVlKG1haW5TY2hlbWEpOwogCSAgICBtYWluU2NoZW1hID0gTlVMTDsKQEAgLTIxMjgyLDcgKzIxMjg2LDcgQEAKICAgICBjdHh0LT5zY2hlbWEgPSBOVUxMOwogICAgIHJldHVybihtYWluU2NoZW1hKTsKIGV4aXRfZmFpbHVyZToKLSAgICAvKiAKKyAgICAvKgogICAgICogUXVpdGUgdmVyYm9zZSwgYnV0IHNob3VsZCBjYXRjaCBpbnRlcm5hbCBlcnJvcnMsIHdoaWNoIHdlcmUKICAgICAqIG5vdCBjb21tdW5pdGF0ZWQuCiAgICAgKi8KQEAgLTIxMjk2LDcgKzIxMzAwLDcgQEAKIAljdHh0LT5vd25zQ29uc3RydWN0b3IgPSAwOwogICAgIH0KICAgICBQRVJST1JfSU5UMigieG1sU2NoZW1hUGFyc2UiLAotCSJBbiBpbnRlcm5hbCBlcnJvciBvY2N1cmVkIik7ICAgIAorCSJBbiBpbnRlcm5hbCBlcnJvciBvY2N1cmVkIik7CiAgICAgY3R4dC0+c2NoZW1hID0gTlVMTDsKICAgICByZXR1cm4oTlVMTCk7CiB9CkBAIC0yMTQzMyw4ICsyMTQzNyw4IEBACiAJICAgIHJldHVybihYTUxfU0NIRU1BX1dISVRFU1BBQ0VfUkVQTEFDRSk7CiAJZWxzZSB7CiAJICAgIC8qCi0JICAgICogRm9yIGFsbCC3YXRvbWljtyBkYXRhdHlwZXMgb3RoZXIgdGhhbiBzdHJpbmcgKGFuZCB0eXBlcyC3ZGVyaXZlZLcKLQkgICAgKiBieSC3cmVzdHJpY3Rpb263IGZyb20gaXQpIHRoZSB2YWx1ZSBvZiB3aGl0ZVNwYWNlIGlzIGZpeGVkIHRvCisJICAgICogRm9yIGFsbCDvv71hdG9taWPvv70gZGF0YXR5cGVzIG90aGVyIHRoYW4gc3RyaW5nIChhbmQgdHlwZXMg77+9ZGVyaXZlZO+/vQorCSAgICAqIGJ5IO+/vXJlc3RyaWN0aW9u77+9IGZyb20gaXQpIHRoZSB2YWx1ZSBvZiB3aGl0ZVNwYWNlIGlzIGZpeGVkIHRvCiAJICAgICogY29sbGFwc2UKIAkgICAgKiBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBidWlsdC1pbiBsaXN0IGRhdGF0eXBlcy4KIAkgICAgKi8KQEAgLTIxNTIxLDExICsyMTUyNSwxMSBAQAogICAgICogWE1MX1NDSEVNQV9TQ0hFTUFfTUFJTiBpZiBpdCBpcyB0aGUgZmlyc3Qgc2NoZW1hIGRvY3VtZW50LgogICAgICovCiAgICAgcmV0ID0geG1sU2NoZW1hQWRkU2NoZW1hRG9jKHBjdHh0LCBYTUxfU0NIRU1BX1NDSEVNQV9JTVBPUlQsCi0JbG9jYXRpb24sIE5VTEwsIE5VTEwsIDAsIG5vZGUsIE5VTEwsIG5zTmFtZSwgCisJbG9jYXRpb24sIE5VTEwsIE5VTEwsIDAsIG5vZGUsIE5VTEwsIG5zTmFtZSwKIAkmYnVja2V0KTsKICAgICBpZiAocmV0ICE9IDApCi0JcmV0dXJuKHJldCk7ICAgIAotICAgIGlmIChidWNrZXQgPT0gTlVMTCkgewkKKwlyZXR1cm4ocmV0KTsKKyAgICBpZiAoYnVja2V0ID09IE5VTEwpIHsKIAkvKgogCSogR2VuZXJhdGUgYSB3YXJuaW5nIHRoYXQgdGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBsb2NhdGVkLgogCSovCkBAIC0yMTU1NSwxNyArMjE1NTksMTcgQEAKICAgICBwY3R4dC0+bmJlcnJvcnMgPSAwOwogICAgIHBjdHh0LT5lcnIgPSAwOwogICAgIHBjdHh0LT5kb2MgPSBidWNrZXQtPmRvYzsKLSAgICAKLSAgICByZXQgPSB4bWxTY2hlbWFQYXJzZU5ld0RvY1dpdGhDb250ZXh0KHBjdHh0LCBzY2hlbWEsIGJ1Y2tldCk7ICAgICAgICAKKworICAgIHJldCA9IHhtbFNjaGVtYVBhcnNlTmV3RG9jV2l0aENvbnRleHQocGN0eHQsIHNjaGVtYSwgYnVja2V0KTsKICAgICBpZiAocmV0ID09IC0xKSB7CiAJcGN0eHQtPmRvYyA9IE5VTEw7CiAJZ290byBleGl0X2ZhaWx1cmU7CiAgICAgfQogICAgIC8qIFBhcmFub2lkIGVycm9yIGNoYW5uZWxsaW5nLiAqLwogICAgIGlmICgocmV0ID09IDApICYmIChwY3R4dC0+bmJlcnJvcnMgIT0gMCkpCi0JcmV0ID0gcGN0eHQtPmVycjsgICAgCi0gICAgaWYgKHBjdHh0LT5uYmVycm9ycyA9PSAwKSB7CQotCS8qIAorCXJldCA9IHBjdHh0LT5lcnI7CisgICAgaWYgKHBjdHh0LT5uYmVycm9ycyA9PSAwKSB7CisJLyoKIAkqIE9ubHkgYm90aGVyIHRvIGZpeHVwIHBlbmRpbmcgY29tcG9uZW50cywgaWYgdGhlcmUgd2FzCiAJKiBubyBlcnJvciB5ZXQuCiAJKiBGb3IgZXZlcnkgWFNJIGFjcXVpcmVkIHNjaGVtYSAoYW5kIGl0cyBzdWItc2NoZW1hdGEpIHdlIHdpbGwKQEAgLTIxNTgxLDcgKzIxNTg1LDcgQEAKIAkgICAgdmN0eHQtPmVyciA9IHJldDsKIAl2Y3R4dC0+bmJlcnJvcnMgKz0gcGN0eHQtPm5iZXJyb3JzOwogICAgIH0gZWxzZSB7Ci0JLyogQWRkIHRvIHZhbGlkYXRpb24gZXJyb3Igc3VtLiAqLyAKKwkvKiBBZGQgdG8gdmFsaWRhdGlvbiBlcnJvciBzdW0uICovCiAJdmN0eHQtPm5iZXJyb3JzICs9IHBjdHh0LT5uYmVycm9yczsKICAgICB9CiAgICAgcGN0eHQtPmRvYyA9IE5VTEw7CkBAIC0yMTU5Miw3ICsyMTU5Niw3IEBACiB9CiAKIHN0YXRpYyB4bWxTY2hlbWFBdHRySW5mb1B0cgoteG1sU2NoZW1hR2V0TWV0YUF0dHJJbmZvKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCwJCSAgICAgIAoreG1sU2NoZW1hR2V0TWV0YUF0dHJJbmZvKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCwKIAkJCSBpbnQgbWV0YVR5cGUpCiB7CiAgICAgaWYgKHZjdHh0LT5uYkF0dHJJbmZvcyA9PSAwKQpAQCAtMjE2ODIsNyArMjE2ODYsNyBAQAogCQkvKgogCQkqIElmIHVzaW5nIEBzY2hlbWFMb2NhdGlvbiB0aGVuIHR1cGxlcyBhcmUgZXhwZWN0ZWQuCiAJCSogSS5lLiB0aGUgbmFtZXNwYWNlIG5hbWUgKmFuZCogdGhlIGRvY3VtZW50J3MgVVJJLgotCQkqLwkJCisJCSovCiAJCXhtbFNjaGVtYUN1c3RvbVdhcm5pbmcoQUNUWFRfQ0FTVCB2Y3R4dCwgWE1MX1NDSEVNQVZfTUlTQywKIAkJICAgIGlhdHRyLT5ub2RlLCBOVUxMLAogCQkgICAgIlRoZSB2YWx1ZSBtdXN0IGNvbnNpc3Qgb2YgdHVwbGVzOiB0aGUgdGFyZ2V0IG5hbWVzcGFjZSAiCkBAIC0yMTcxMSw3ICsyMTcxNSw3IEBACiAgICAgaWYgKHZjdHh0LT5zYXggIT0gTlVMTCkgewogCWludCBpLCBqOwogCXhtbFNjaGVtYU5vZGVJbmZvUHRyIGlub2RlOwotCQorCiAJZm9yIChpID0gdmN0eHQtPmRlcHRoOyBpID49IDA7IGktLSkgewogCSAgICBpZiAodmN0eHQtPmVsZW1JbmZvc1tpXS0+bmJOc0JpbmRpbmdzICE9IDApIHsKIAkJaW5vZGUgPSB2Y3R4dC0+ZWxlbUluZm9zW2ldOwpAQCAtMjE3MjUsMTYgKzIxNzI5LDE2IEBACiAJCQkqIE5vdGUgdGhhdCB0aGUgbmFtZXNwYWNlIGJpbmRpbmdzIGFyZSBhbHJlYWR5CiAJCQkqIGluIGEgc3RyaW5nIGRpY3QuCiAJCQkqLwotCQkJcmV0dXJuIChpbm9kZS0+bnNCaW5kaW5nc1tqKzFdKTsJCQkKKwkJCXJldHVybiAoaW5vZGUtPm5zQmluZGluZ3NbaisxXSk7CiAJCSAgICB9CiAJCX0KIAkgICAgfQogCX0KIAlyZXR1cm4gKE5VTEwpOwotI2lmZGVmIExJQlhNTF9XUklURVJfRU5BQkxFRAorI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAogICAgIH0gZWxzZSBpZiAodmN0eHQtPnJlYWRlciAhPSBOVUxMKSB7CiAJeG1sQ2hhciAqbnNOYW1lOwotCQorCiAJbnNOYW1lID0geG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZSh2Y3R4dC0+cmVhZGVyLCBwcmVmaXgpOwogCWlmIChuc05hbWUgIT0gTlVMTCkgewogCSAgICBjb25zdCB4bWxDaGFyICpyZXQ7CkBAIC0yMTc2Niw3ICsyMTc3MCw3IEBACiAqIFRoaXMgb25lIHdvcmtzIG9uIHRoZSBzY2hlbWEgb2YgdGhlIHZhbGlkYXRpb24gY29udGV4dC4KICovCiBzdGF0aWMgaW50Ci14bWxTY2hlbWFWYWxpZGF0ZU5vdGF0aW9uKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCwgCQkJICAKK3htbFNjaGVtYVZhbGlkYXRlTm90YXRpb24oeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZjdHh0LAogCQkJICB4bWxTY2hlbWFQdHIgc2NoZW1hLAogCQkJICB4bWxOb2RlUHRyIG5vZGUsCiAJCQkgIGNvbnN0IHhtbENoYXIgKnZhbHVlLApAQCAtMjE3OTEsNyArMjE3OTUsNyBAQAogCWlmIChwcmVmaXggIT0gTlVMTCkgewogCSAgICBjb25zdCB4bWxDaGFyICpuc05hbWUgPSBOVUxMOwogCi0JICAgIGlmICh2Y3R4dCAhPSBOVUxMKSAKKwkgICAgaWYgKHZjdHh0ICE9IE5VTEwpCiAJCW5zTmFtZSA9IHhtbFNjaGVtYUxvb2t1cE5hbWVzcGFjZSh2Y3R4dCwgQkFEX0NBU1QgcHJlZml4KTsKIAkgICAgZWxzZSBpZiAobm9kZSAhPSBOVUxMKSB7CiAJCXhtbE5zUHRyIG5zID0geG1sU2VhcmNoTnMobm9kZS0+ZG9jLCBub2RlLCBwcmVmaXgpOwpAQCAtMjE4MDgsOSArMjE4MTIsOSBAQAogCQlyZXR1cm4gKDEpOwogCSAgICB9CiAJICAgIGlmICh4bWxTY2hlbWFHZXROb3RhdGlvbihzY2hlbWEsIGxvY2FsTmFtZSwgbnNOYW1lKSAhPSBOVUxMKSB7Ci0JCWlmICh2YWxOZWVkZWQgJiYgKHZhbCAhPSBOVUxMKSkgewotCQkgICAgKCp2YWwpID0geG1sU2NoZW1hTmV3Tk9UQVRJT05WYWx1ZShCQURfQ0FTVCBsb2NhbE5hbWUsCi0JCQlCQURfQ0FTVCB4bWxTdHJkdXAobnNOYW1lKSk7CisJCWlmICgodmFsTmVlZGVkKSAmJiAodmFsICE9IE5VTEwpKSB7CisJCSAgICAoKnZhbCkgPSB4bWxTY2hlbWFOZXdOT1RBVElPTlZhbHVlKHhtbFN0cmR1cChsb2NhbE5hbWUpLAorCQkJCQkJICAgICAgIHhtbFN0cmR1cChuc05hbWUpKTsKIAkJICAgIGlmICgqdmFsID09IE5VTEwpCiAJCQlyZXQgPSAtMTsKIAkJfQpAQCAtMjIxNDMsNyArMjIxNDcsNyBAQAogICAgIGlmIChiaW5kLT5ub2RlVGFibGUgIT0gTlVMTCkKIAl4bWxGcmVlKGJpbmQtPm5vZGVUYWJsZSk7CiAgICAgaWYgKGJpbmQtPmR1cGxzICE9IE5VTEwpCi0JeG1sU2NoZW1hSXRlbUxpc3RGcmVlKGJpbmQtPmR1cGxzKTsJCisJeG1sU2NoZW1hSXRlbUxpc3RGcmVlKGJpbmQtPmR1cGxzKTsKICAgICB4bWxGcmVlKGJpbmQpOwogfQogCkBAIC0yMjE3OCwxMiArMjIxODIsMTIgQEAKIAogICAgIHdoaWxlIChtYXRjaGVyICE9IE5VTEwpIHsKIAluZXh0ID0gbWF0Y2hlci0+bmV4dDsKLQlpZiAobWF0Y2hlci0+a2V5U2VxcyAhPSBOVUxMKSB7CSAgICAKKwlpZiAobWF0Y2hlci0+a2V5U2VxcyAhPSBOVUxMKSB7CiAJICAgIGludCBpOwogCSAgICBmb3IgKGkgPSAwOyBpIDwgbWF0Y2hlci0+c2l6ZUtleVNlcXM7IGkrKykKIAkJaWYgKG1hdGNoZXItPmtleVNlcXNbaV0gIT0gTlVMTCkKIAkJICAgIHhtbEZyZWUobWF0Y2hlci0+a2V5U2Vxc1tpXSk7Ci0JICAgIHhtbEZyZWUobWF0Y2hlci0+a2V5U2Vxcyk7CSAgICAKKwkgICAgeG1sRnJlZShtYXRjaGVyLT5rZXlTZXFzKTsKIAl9CiAJaWYgKG1hdGNoZXItPnRhcmdldHMgIT0gTlVMTCkgewogCSAgICBpZiAobWF0Y2hlci0+aWRjVHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfSURDX0tFWVJFRikgewpAQCAtMjIyMjMsNyArMjIyMjcsNyBAQAogCiAgICAgd2hpbGUgKG1hdGNoZXIgIT0gTlVMTCkgewogCW5leHQgPSBtYXRjaGVyLT5uZXh0OwotCWlmIChtYXRjaGVyLT5rZXlTZXFzICE9IE5VTEwpIHsJICAgIAorCWlmIChtYXRjaGVyLT5rZXlTZXFzICE9IE5VTEwpIHsKIAkgICAgaW50IGk7CiAJICAgIC8qCiAJICAgICogRG9uJ3QgZnJlZSB0aGUgYXJyYXksIGJ1dCBvbmx5IHRoZSBjb250ZW50LgpAQCAtMjIyNTIsNyArMjIyNTYsNyBAQAogCSAgICB9CiAJICAgIHhtbFNjaGVtYUl0ZW1MaXN0RnJlZShtYXRjaGVyLT50YXJnZXRzKTsKIAkgICAgbWF0Y2hlci0+dGFyZ2V0cyA9IE5VTEw7Ci0JfQkKKwl9CiAJbWF0Y2hlci0+bmV4dCA9IE5VTEw7CiAJLyoKIAkqIENhY2hlIHRoZSBtYXRjaGVyLgpAQCAtMjIyOTQsNyArMjIyOTgsNyBAQAogCXN0byA9IHZjdHh0LT54cGF0aFN0YXRlUG9vbDsKIAl2Y3R4dC0+eHBhdGhTdGF0ZVBvb2wgPSBzdG8tPm5leHQ7CiAJc3RvLT5uZXh0ID0gTlVMTDsKLSAgICB9IGVsc2UgewkKKyAgICB9IGVsc2UgewogCS8qCiAJKiBDcmVhdGUgYSBuZXcgc3RhdGUgb2JqZWN0LgogCSovCkBAIC0yMjMwNSwxMCArMjIzMDksMTAgQEAKIAkgICAgcmV0dXJuICgtMSk7CiAJfQogCW1lbXNldChzdG8sIDAsIHNpemVvZih4bWxTY2hlbWFJRENTdGF0ZU9iaikpOwotICAgIH0JCisgICAgfQogICAgIC8qCi0gICAgKiBBZGQgdG8gZ2xvYmFsIGxpc3QuIAotICAgICovCQorICAgICogQWRkIHRvIGdsb2JhbCBsaXN0LgorICAgICovCiAgICAgaWYgKHZjdHh0LT54cGF0aFN0YXRlcyAhPSBOVUxMKQogCXN0by0+bmV4dCA9IHZjdHh0LT54cGF0aFN0YXRlczsKICAgICB2Y3R4dC0+eHBhdGhTdGF0ZXMgPSBzdG87CkBAIC0yMjMyOCwxMyArMjIzMzIsMTMgQEAKIAlWRVJST1JfSU5UKCJ4bWxTY2hlbWFJRENBZGRTdGF0ZU9iamVjdCIsCiAJICAgICJmYWlsZWQgdG8gY3JlYXRlIGFuIFhQYXRoIHZhbGlkYXRpb24gY29udGV4dCIpOwogCXJldHVybiAoLTEpOwotICAgIH0gICAgCisgICAgfQogICAgIHN0by0+dHlwZSA9IHR5cGU7CiAgICAgc3RvLT5kZXB0aCA9IHZjdHh0LT5kZXB0aDsKICAgICBzdG8tPm1hdGNoZXIgPSBtYXRjaGVyOwogICAgIHN0by0+c2VsID0gc2VsOwogICAgIHN0by0+bmJIaXN0b3J5ID0gMDsKLSAgICAKKwogI2lmZGVmIERFQlVHX0lEQwogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiSURDOiAgIFNUTyBwdXNoICclcydcbiIsCiAJc3RvLT5zZWwtPnhwYXRoKTsKQEAgLTIyMzU4LDcgKzIyMzYyLDcgQEAKIHsKICAgICB4bWxTY2hlbWFJRENTdGF0ZU9ialB0ciBzdG8sIGhlYWQgPSBOVUxMLCBmaXJzdDsKICAgICBpbnQgcmVzLCByZXNvbHZlZCA9IDAsIGRlcHRoID0gdmN0eHQtPmRlcHRoOwotICAgICAgICAKKwogICAgIGlmICh2Y3R4dC0+eHBhdGhTdGF0ZXMgPT0gTlVMTCkKIAlyZXR1cm4gKDApOwogCkBAIC0yMjM2Nyw4ICsyMjM3MSw4IEBACiAjaWZkZWYgREVCVUdfSURDCiAgICAgewogCXhtbENoYXIgKnN0ciA9IE5VTEw7Ci0JeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsIAotCSAgICAiSURDOiBFVkFMIG9uICVzLCBkZXB0aCAlZCwgdHlwZSAlZFxuIiwJICAgIAorCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAorCSAgICAiSURDOiBFVkFMIG9uICVzLCBkZXB0aCAlZCwgdHlwZSAlZFxuIiwKIAkgICAgeG1sU2NoZW1hRm9ybWF0UU5hbWUoJnN0ciwgdmN0eHQtPmlub2RlLT5uc05hbWUsCiAJCXZjdHh0LT5pbm9kZS0+bG9jYWxOYW1lKSwgZGVwdGgsIG5vZGVUeXBlKTsKIAlGUkVFX0FORF9OVUxMKHN0cikKQEAgLTIyMzgyLDEwICsyMjM4NiwxMCBAQAogICAgIHdoaWxlIChzdG8gIT0gaGVhZCkgewogI2lmZGVmIERFQlVHX0lEQwogCWlmIChzdG8tPnR5cGUgPT0gWFBBVEhfU1RBVEVfT0JKX1RZUEVfSURDX1NFTEVDVE9SKQotCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgIklEQzogICBbJyVzJ10gc2VsZWN0b3IgJyVzJ1xuIiwgCisJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiSURDOiAgIFsnJXMnXSBzZWxlY3RvciAnJXMnXG4iLAogCQlzdG8tPm1hdGNoZXItPmFpZGMtPmRlZi0+bmFtZSwgc3RvLT5zZWwtPnhwYXRoKTsKIAllbHNlCi0JICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiSURDOiAgIFsnJXMnXSBmaWVsZCAnJXMnXG4iLCAKKwkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJJREM6ICAgWyclcyddIGZpZWxkICclcydcbiIsCiAJCXN0by0+bWF0Y2hlci0+YWlkYy0+ZGVmLT5uYW1lLCBzdG8tPnNlbC0+eHBhdGgpOwogI2VuZGlmCiAJaWYgKG5vZGVUeXBlID09IFhNTF9FTEVNRU5UX05PREUpCkBAIC0yMjQxNSw3ICsyMjQxOSw3IEBACiAJaWYgKHN0by0+aGlzdG9yeSA9PSBOVUxMKSB7CiAJICAgIHN0by0+aGlzdG9yeSA9IChpbnQgKikgeG1sTWFsbG9jKDUgKiBzaXplb2YoaW50KSk7CiAJICAgIGlmIChzdG8tPmhpc3RvcnkgPT0gTlVMTCkgewotCQl4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsIAorCQl4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsCiAJCSAgICAiYWxsb2NhdGluZyB0aGUgc3RhdGUgb2JqZWN0IGhpc3RvcnkiLCBOVUxMKTsKIAkJcmV0dXJuKC0xKTsKIAkgICAgfQpAQCAtMjI0MjUsMTEgKzIyNDI5LDExIEBACiAJICAgIHN0by0+aGlzdG9yeSA9IChpbnQgKikgeG1sUmVhbGxvYyhzdG8tPmhpc3RvcnksCiAJCXN0by0+c2l6ZUhpc3RvcnkgKiBzaXplb2YoaW50KSk7CiAJICAgIGlmIChzdG8tPmhpc3RvcnkgPT0gTlVMTCkgewotCQl4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsIAorCQl4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsCiAJCSAgICAicmUtYWxsb2NhdGluZyB0aGUgc3RhdGUgb2JqZWN0IGhpc3RvcnkiLCBOVUxMKTsKIAkJcmV0dXJuKC0xKTsKIAkgICAgfQotCX0JCQorCX0KIAlzdG8tPmhpc3Rvcnlbc3RvLT5uYkhpc3RvcnkrK10gPSBkZXB0aDsKIAogI2lmZGVmIERFQlVHX0lEQwpAQCAtMjI0OTgsNyArMjI1MDIsNyBAQAogICAgICpidWYgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIlsiKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiciKTsKLQlyZXMgPSB4bWxTY2hlbWFHZXRDYW5vblZhbHVlV2h0c3BFeHQoc2VxW2ldLT52YWwsIAorCXJlcyA9IHhtbFNjaGVtYUdldENhbm9uVmFsdWVXaHRzcEV4dChzZXFbaV0tPnZhbCwKIAkgICAgeG1sU2NoZW1hR2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUoc2VxW2ldLT50eXBlKSwKIAkgICAgJnZhbHVlKTsKIAlpZiAocmVzID09IDApCkBAIC0yMjU1Niw3ICsyMjU2MCw3IEBACiAgKgogICogUHJvY2Vzc2VzIGFuZCBwb3BzIHRoZSBoaXN0b3J5IGl0ZW1zIG9mIHRoZSBJREMgc3RhdGUgb2JqZWN0cy4KICAqIElEQyBrZXktc2VxdWVuY2VzIGFyZSB2YWxpZGF0ZWQvY3JlYXRlZCBvbiBJREMgYmluZGluZ3MuCi0gKiAKKyAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gaW50ZXJuYWwgZXJyb3JzLgogICovCiBzdGF0aWMgaW50CkBAIC0yMjU3NSwxMyArMjI1NzksMTMgQEAKICNpZmRlZiBERUJVR19JREMKICAgICB7CiAJeG1sQ2hhciAqc3RyID0gTlVMTDsKLQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgCisJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICJJREM6IEJBQ0sgb24gJXMsIGRlcHRoICVkXG4iLAogCSAgICB4bWxTY2hlbWFGb3JtYXRRTmFtZSgmc3RyLCB2Y3R4dC0+aW5vZGUtPm5zTmFtZSwKIAkJdmN0eHQtPmlub2RlLT5sb2NhbE5hbWUpLCB2Y3R4dC0+ZGVwdGgpOwogCUZSRUVfQU5EX05VTEwoc3RyKQogICAgIH0KLSNlbmRpZiAgICAKKyNlbmRpZgogICAgIC8qCiAgICAgKiBFdmFsdWF0ZSB0aGUgc3RhdGUgb2JqZWN0cy4KICAgICAqLwpAQCAtMjI2MDcsMTQgKzIyNjExLDE0IEBACiAJaWYgKG1hdGNoRGVwdGggIT0gZGVwdGgpIHsKIAkgICAgc3RvID0gc3RvLT5uZXh0OwogCSAgICBjb250aW51ZTsKLQl9CQorCX0KIAlpZiAoc3RvLT50eXBlID09IFhQQVRIX1NUQVRFX09CSl9UWVBFX0lEQ19GSUVMRCkgewogCSAgICAvKgogCSAgICAqIE5PVEU6IEFjY29yZGluZyB0bwogCSAgICAqICAgaHR0cDovL3d3dy53My5vcmcvQnVncy9QdWJsaWMvc2hvd19idWcuY2dpP2lkPTIxOTgKIAkgICAgKiAgIC4uLiB0aGUgc2ltcGxlLWNvbnRlbnQgb2YgY29tcGxleCB0eXBlcyBpcyBhbHNvIGFsbG93ZWQuCiAJICAgICovCi0JICAgIAorCiAJICAgIGlmIChXWFNfSVNfQ09NUExFWCh0eXBlKSkgewogCQlpZiAoV1hTX0hBU19TSU1QTEVfQ09OVEVOVCh0eXBlKSkgewogCQkgICAgLyoKQEAgLTIyNjI5LDE3ICsyMjYzMywxNyBAQAogCQkgICAgfQogCQl9IGVsc2UKIAkJICAgIHNpbXBsZVR5cGUgPSBOVUxMOwotCSAgICB9IGVsc2UgCisJICAgIH0gZWxzZQogCQlzaW1wbGVUeXBlID0gdHlwZTsKIAkgICAgaWYgKHNpbXBsZVR5cGUgPT0gTlVMTCkgewogCQl4bWxDaGFyICpzdHIgPSBOVUxMOwotCQorCiAJCS8qCiAJCSogTm90IHF1YWxpZmllZCBpZiB0aGUgZmllbGQgcmVzb2x2ZXMgdG8gYSBub2RlIG9mIG5vbgogCQkqIHNpbXBsZSB0eXBlLgotCQkqLwkKKwkJKi8KIAkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgdmN0eHQsCi0JCSAgICBYTUxfU0NIRU1BVl9DVkNfSURDLCBOVUxMLAkJICAgIAorCQkgICAgWE1MX1NDSEVNQVZfQ1ZDX0lEQywgTlVMTCwKIAkJICAgIFdYU19CQVNJQ19DQVNUIHN0by0+bWF0Y2hlci0+YWlkYy0+ZGVmLAogCQkgICAgIlRoZSBYUGF0aCAnJXMnIG9mIGEgZmllbGQgb2YgJXMgZG9lcyBldmFsdWF0ZSB0byBhIG5vZGUgb2YgIgogCQkgICAgIm5vbi1zaW1wbGUgdHlwZSIsCkBAIC0yMjY0OSw3ICsyMjY1Myw3IEBACiAJCXN0by0+bmJIaXN0b3J5LS07CiAJCWdvdG8gZGVyZWdpc3Rlcl9jaGVjazsKIAkgICAgfQotCSAgICAKKwogCSAgICBpZiAoKGtleSA9PSBOVUxMKSAmJiAodmN0eHQtPmlub2RlLT52YWwgPT0gTlVMTCkpIHsKIAkJLyoKIAkJKiBGYWlsZWQgdG8gcHJvdmlkZSB0aGUgbm9ybWFsaXplZCB2YWx1ZTsgbWF5YmUKQEAgLTIyNjY1LDEzICsyMjY2OSwxMyBAQAogCQl4bWxTY2hlbWFJRENNYXRjaGVyUHRyIG1hdGNoZXIgPSBzdG8tPm1hdGNoZXI7CiAJCXhtbFNjaGVtYVBTVklJRENLZXlQdHIgKmtleVNlcTsKIAkJaW50IHBvcywgaWR4OwotCQkKKwogCQkvKgogCQkqIFRoZSBrZXkgd2lsbCBiZSBhbmNob3JlZCBvbiB0aGUgbWF0Y2hlcidzIGxpc3Qgb2YKIAkJKiBrZXktc2VxdWVuY2VzLiBUaGUgcG9zaXRpb24gaW4gdGhpcyBsaXN0IGlzIGRldGVybWluZWQKIAkJKiBieSB0aGUgdGFyZ2V0IG5vZGUncyBkZXB0aCByZWxhdGl2ZSB0byB0aGUgbWF0Y2hlcidzCiAJCSogZGVwdGggb2YgY3JlYXRpb24gKGkuZS4gdGhlIGRlcHRoIG9mIHRoZSBzY29wZSBlbGVtZW50KS4KLQkJKiAKKwkJKgogCQkqIEVsZW1lbnQgICAgICAgIERlcHRoICAgIFBvcyAgIExpc3QtZW50cmllcwogCQkqIDxzY29wZT4gICAgICAgICAgMCAgICAgICAgICAgICAgTlVMTAogCQkqICAgPGJhcj4gICAgICAgICAgMSAgICAgICAgICAgICAgTlVMTApAQCAtMjI2ODIsMjMgKzIyNjg2LDIzIEBACiAJCSogVGhlIHNpemUgb2YgdGhlIGxpc3QgaXMgb25seSBkZXBlbmRhbnQgb24gdGhlIGRlcHRoIG9mCiAJCSogdGhlIHRyZWUuCiAJCSogQW4gZW50cnkgd2lsbCBiZSBOVUxMZWQgaW4gc2VsZWN0b3JfbGVhdmUsIGkuZS4gd2hlbgotCQkqIHdlIGhpdCB0aGUgdGFyZ2V0J3MgCi0JCSovCQkgICAgCisJCSogd2UgaGl0IHRoZSB0YXJnZXQncworCQkqLwogCQlwb3MgPSBzdG8tPmRlcHRoIC0gbWF0Y2hlci0+ZGVwdGg7CiAJCWlkeCA9IHN0by0+c2VsLT5pbmRleDsKLQkJCisKIAkJLyoKIAkJKiBDcmVhdGUvZ3JvdyB0aGUgYXJyYXkgb2Yga2V5LXNlcXVlbmNlcy4KIAkJKi8KIAkJaWYgKG1hdGNoZXItPmtleVNlcXMgPT0gTlVMTCkgewotCQkgICAgaWYgKHBvcyA+IDkpIAorCQkgICAgaWYgKHBvcyA+IDkpCiAJCQltYXRjaGVyLT5zaXplS2V5U2VxcyA9IHBvcyAqIDI7CiAJCSAgICBlbHNlCiAJCQltYXRjaGVyLT5zaXplS2V5U2VxcyA9IDEwOwotCQkgICAgbWF0Y2hlci0+a2V5U2VxcyA9ICh4bWxTY2hlbWFQU1ZJSURDS2V5UHRyICoqKSAKKwkJICAgIG1hdGNoZXItPmtleVNlcXMgPSAoeG1sU2NoZW1hUFNWSUlEQ0tleVB0ciAqKikKIAkJCXhtbE1hbGxvYyhtYXRjaGVyLT5zaXplS2V5U2VxcyAqCi0JCQlzaXplb2YoeG1sU2NoZW1hUFNWSUlEQ0tleVB0ciAqKSk7CQkJCi0JCSAgICBpZiAobWF0Y2hlci0+a2V5U2VxcyA9PSBOVUxMKSB7CQkKKwkJCXNpemVvZih4bWxTY2hlbWFQU1ZJSURDS2V5UHRyICopKTsKKwkJICAgIGlmIChtYXRjaGVyLT5rZXlTZXFzID09IE5VTEwpIHsKIAkJCXhtbFNjaGVtYVZFcnJNZW1vcnkoTlVMTCwKIAkJCSAgICAiYWxsb2NhdGluZyBhbiBhcnJheSBvZiBrZXktc2VxdWVuY2VzIiwKIAkJCSAgICBOVUxMKTsKQEAgLTIyNzA3LDkgKzIyNzExLDkgQEAKIAkJICAgIG1lbXNldChtYXRjaGVyLT5rZXlTZXFzLCAwLAogCQkJbWF0Y2hlci0+c2l6ZUtleVNlcXMgKgogCQkJc2l6ZW9mKHhtbFNjaGVtYVBTVklJRENLZXlQdHIgKikpOwotCQl9IGVsc2UgaWYgKHBvcyA+PSBtYXRjaGVyLT5zaXplS2V5U2VxcykgewkKKwkJfSBlbHNlIGlmIChwb3MgPj0gbWF0Y2hlci0+c2l6ZUtleVNlcXMpIHsKIAkJICAgIGludCBpID0gbWF0Y2hlci0+c2l6ZUtleVNlcXM7Ci0JCSAgICAKKwogCQkgICAgbWF0Y2hlci0+c2l6ZUtleVNlcXMgKj0gMjsKIAkJICAgIG1hdGNoZXItPmtleVNlcXMgPSAoeG1sU2NoZW1hUFNWSUlEQ0tleVB0ciAqKikKIAkJCXhtbFJlYWxsb2MobWF0Y2hlci0+a2V5U2VxcywKQEAgLTIyNzI1LDI5ICsyMjcyOSwyOSBAQAogCQkgICAgKiBUaGUgYXJyYXkgbmVlZHMgdG8gYmUgTlVMTGVkLgogCQkgICAgKiBUT0RPOiBVc2UgbWVtc2V0PwogCQkgICAgKi8KLQkJICAgIGZvciAoOyBpIDwgbWF0Y2hlci0+c2l6ZUtleVNlcXM7IGkrKykgCi0JCQltYXRjaGVyLT5rZXlTZXFzW2ldID0gTlVMTDsJCQkKKwkJICAgIGZvciAoOyBpIDwgbWF0Y2hlci0+c2l6ZUtleVNlcXM7IGkrKykKKwkJCW1hdGNoZXItPmtleVNlcXNbaV0gPSBOVUxMOwogCQl9Ci0JCQorCiAJCS8qCiAJCSogR2V0L2NyZWF0ZSB0aGUga2V5LXNlcXVlbmNlLgogCQkqLwotCQlrZXlTZXEgPSBtYXRjaGVyLT5rZXlTZXFzW3Bvc107CQkgICAgCi0JCWlmIChrZXlTZXEgPT0gTlVMTCkgewkKKwkJa2V5U2VxID0gbWF0Y2hlci0+a2V5U2Vxc1twb3NdOworCQlpZiAoa2V5U2VxID09IE5VTEwpIHsKIAkJICAgIGdvdG8gY3JlYXRlX3NlcXVlbmNlOwogCQl9IGVsc2UgaWYgKGtleVNlcVtpZHhdICE9IE5VTEwpIHsKIAkJICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CiAJCSAgICAvKgogCQkgICAgKiBjdmMtaWRlbnRpdHktY29uc3RyYWludDoKLQkJICAgICogMyBGb3IgZWFjaCBub2RlIGluIHRoZSC3dGFyZ2V0IG5vZGUgc2V0tyBhbGwKKwkJICAgICogMyBGb3IgZWFjaCBub2RlIGluIHRoZSDvv710YXJnZXQgbm9kZSBzZXTvv70gYWxsCiAJCSAgICAqIG9mIHRoZSB7ZmllbGRzfSwgd2l0aCB0aGF0IG5vZGUgYXMgdGhlIGNvbnRleHQKIAkJICAgICogbm9kZSwgZXZhbHVhdGUgdG8gZWl0aGVyIGFuIGVtcHR5IG5vZGUtc2V0IG9yCiAJCSAgICAqIGEgbm9kZS1zZXQgd2l0aCBleGFjdGx5IG9uZSBtZW1iZXIsIHdoaWNoIG11c3QKIAkJICAgICogaGF2ZSBhIHNpbXBsZSB0eXBlLgotCQkgICAgKiAKKwkJICAgICoKIAkJICAgICogVGhlIGtleSB3YXMgYWxyZWFkeSBzZXQ7IHJlcG9ydCBhbiBlcnJvci4KIAkJICAgICovCi0JCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwgCisJCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwKIAkJCVhNTF9TQ0hFTUFWX0NWQ19JREMsIE5VTEwsCiAJCQlXWFNfQkFTSUNfQ0FTVCBtYXRjaGVyLT5haWRjLT5kZWYsCiAJCQkiVGhlIFhQYXRoICclcycgb2YgYSBmaWVsZCBvZiAlcyBldmFsdWF0ZXMgdG8gYSAiCkBAIC0yMjc1OCwyNyArMjI3NjIsMjcgQEAKIAkJICAgIHN0by0+bmJIaXN0b3J5LS07CiAJCSAgICBnb3RvIGRlcmVnaXN0ZXJfY2hlY2s7CiAJCX0gZWxzZQotCQkgICAgZ290byBjcmVhdGVfa2V5OwkJCi0JCQorCQkgICAgZ290byBjcmVhdGVfa2V5OworCiBjcmVhdGVfc2VxdWVuY2U6CiAJCS8qCiAJCSogQ3JlYXRlIGEga2V5LXNlcXVlbmNlLgogCQkqLwogCQlrZXlTZXEgPSAoeG1sU2NoZW1hUFNWSUlEQ0tleVB0ciAqKSB4bWxNYWxsb2MoCi0JCSAgICBtYXRjaGVyLT5haWRjLT5kZWYtPm5iRmllbGRzICogCisJCSAgICBtYXRjaGVyLT5haWRjLT5kZWYtPm5iRmllbGRzICoKIAkJICAgIHNpemVvZih4bWxTY2hlbWFQU1ZJSURDS2V5UHRyKSk7CiAJCWlmIChrZXlTZXEgPT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hVkVyck1lbW9yeShOVUxMLCAKKwkJICAgIHhtbFNjaGVtYVZFcnJNZW1vcnkoTlVMTCwKIAkJCSJhbGxvY2F0aW5nIGFuIElEQyBrZXktc2VxdWVuY2UiLCBOVUxMKTsKLQkJICAgIHJldHVybigtMSk7CQkJCi0JCX0JCi0JCW1lbXNldChrZXlTZXEsIDAsIG1hdGNoZXItPmFpZGMtPmRlZi0+bmJGaWVsZHMgKiAKKwkJICAgIHJldHVybigtMSk7CisJCX0KKwkJbWVtc2V0KGtleVNlcSwgMCwgbWF0Y2hlci0+YWlkYy0+ZGVmLT5uYkZpZWxkcyAqCiAJCSAgICBzaXplb2YoeG1sU2NoZW1hUFNWSUlEQ0tleVB0cikpOwogCQltYXRjaGVyLT5rZXlTZXFzW3Bvc10gPSBrZXlTZXE7CiBjcmVhdGVfa2V5OgogCQkvKgogCQkqIENyZWF0ZSBhIGtleSBvbmNlIHBlciBub2RlIG9ubHkuCi0JCSovICAKKwkJKi8KIAkJaWYgKGtleSA9PSBOVUxMKSB7CiAJCSAgICBrZXkgPSAoeG1sU2NoZW1hUFNWSUlEQ0tleVB0cikgeG1sTWFsbG9jKAogCQkJc2l6ZW9mKHhtbFNjaGVtYVBTVklJRENLZXkpKTsKQEAgLTIyNzg3LDcgKzIyNzkxLDcgQEAKIAkJCSAgICAiYWxsb2NhdGluZyBhIElEQyBrZXkiLCBOVUxMKTsKIAkJCXhtbEZyZWUoa2V5U2VxKTsKIAkJCW1hdGNoZXItPmtleVNlcXNbcG9zXSA9IE5VTEw7Ci0JCQlyZXR1cm4oLTEpOwkJCQorCQkJcmV0dXJuKC0xKTsKIAkJICAgIH0KIAkJICAgIC8qCiAJCSAgICAqIENvbnN1bWUgdGhlIGNvbXBpbGVkIHZhbHVlLgpAQCAtMjI4MDMsMTAgKzIyODA3LDEwIEBACiAJCQlyZXR1cm4gKC0xKTsKIAkJICAgIH0KIAkJfQotCQlrZXlTZXFbaWR4XSA9IGtleTsJCSAgICAKKwkJa2V5U2VxW2lkeF0gPSBrZXk7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHN0by0+dHlwZSA9PSBYUEFUSF9TVEFURV9PQkpfVFlQRV9JRENfU0VMRUNUT1IpIHsKLQkJCisKIAkgICAgeG1sU2NoZW1hUFNWSUlEQ0tleVB0ciAqKmtleVNlcSA9IE5VTEw7CiAJICAgIC8qIHhtbFNjaGVtYVBTVklJRENCaW5kaW5nUHRyIGJpbmQ7ICovCiAJICAgIHhtbFNjaGVtYVBTVklJRENOb2RlUHRyIG50SXRlbTsKQEAgLTIyODE3LDIyICsyMjgyMSwyMiBAQAogCSAgICAvKgogCSAgICAqIEhlcmUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgogCSAgICAqIEFuIElEQyAnc2VsZWN0b3InIHN0YXRlIG9iamVjdCByZXNvbHZlZCB0byBhIHRhcmdldCBub2RlLAotCSAgICAqIGR1cmluZyB0aGUgdGltZSB0aGlzIHRhcmdldCBub2RlIHdhcyBpbiB0aGUgCi0JICAgICogYW5jZXN0b3Itb3Itc2VsZiBheGlzLCB0aGUgJ2ZpZWxkJyBzdGF0ZSBvYmplY3QocykgbG9va2VkIAotCSAgICAqIG91dCBmb3IgbWF0Y2hpbmcgbm9kZXMgdG8gY3JlYXRlIGEga2V5LXNlcXVlbmNlIGZvciB0aGlzIAorCSAgICAqIGR1cmluZyB0aGUgdGltZSB0aGlzIHRhcmdldCBub2RlIHdhcyBpbiB0aGUKKwkgICAgKiBhbmNlc3Rvci1vci1zZWxmIGF4aXMsIHRoZSAnZmllbGQnIHN0YXRlIG9iamVjdChzKSBsb29rZWQKKwkgICAgKiBvdXQgZm9yIG1hdGNoaW5nIG5vZGVzIHRvIGNyZWF0ZSBhIGtleS1zZXF1ZW5jZSBmb3IgdGhpcwogCSAgICAqIHRhcmdldCBub2RlLiBOb3cgd2UgYXJlIGJhY2sgdG8gdGhpcyB0YXJnZXQgbm9kZSBhbmQgbmVlZAotCSAgICAqIHRvIHB1dCB0aGUga2V5LXNlcXVlbmNlLCB0b2dldGhlciB3aXRoIHRoZSB0YXJnZXQgbm9kZSAKLQkgICAgKiBpdHNlbGYsIGludG8gdGhlIG5vZGUtdGFibGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgSURDIAorCSAgICAqIHRvIHB1dCB0aGUga2V5LXNlcXVlbmNlLCB0b2dldGhlciB3aXRoIHRoZSB0YXJnZXQgbm9kZQorCSAgICAqIGl0c2VsZiwgaW50byB0aGUgbm9kZS10YWJsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBJREMKIAkgICAgKiBiaW5kaW5nLgogCSAgICAqLwogCSAgICBtYXRjaGVyID0gc3RvLT5tYXRjaGVyOwogCSAgICBpZGMgPSBtYXRjaGVyLT5haWRjLT5kZWY7CiAJICAgIG5iS2V5cyA9IGlkYy0+bmJGaWVsZHM7Ci0JICAgIHBvcyA9IGRlcHRoIC0gbWF0Y2hlci0+ZGVwdGg7CQkKKwkgICAgcG9zID0gZGVwdGggLSBtYXRjaGVyLT5kZXB0aDsKIAkgICAgLyoKIAkgICAgKiBDaGVjayBpZiB0aGUgbWF0Y2hlciBoYXMgYW55IGtleS1zZXF1ZW5jZXMgYXQgYWxsLCBwbHVzCiAJICAgICogaWYgaXQgaGFzIGEga2V5LXNlcXVlbmNlIGZvciB0aGUgY3VycmVudCB0YXJnZXQgbm9kZS4KLQkgICAgKi8JCQorCSAgICAqLwogCSAgICBpZiAoKG1hdGNoZXItPmtleVNlcXMgPT0gTlVMTCkgfHwKIAkJKG1hdGNoZXItPnNpemVLZXlTZXFzIDw9IHBvcykpIHsKIAkJaWYgKGlkYy0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfSURDX0tFWSkKQEAgLTIyODQwLDE1ICsyMjg0NCwxNSBAQAogCQllbHNlCiAJCSAgICBnb3RvIHNlbGVjdG9yX2xlYXZlOwogCSAgICB9Ci0JICAgIAotCSAgICBrZXlTZXEgPSAmKG1hdGNoZXItPmtleVNlcXNbcG9zXSk7CQkKKworCSAgICBrZXlTZXEgPSAmKG1hdGNoZXItPmtleVNlcXNbcG9zXSk7CiAJICAgIGlmICgqa2V5U2VxID09IE5VTEwpIHsKIAkJaWYgKGlkYy0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfSURDX0tFWSkKIAkJICAgIGdvdG8gc2VsZWN0b3Jfa2V5X2Vycm9yOwogCQllbHNlCiAJCSAgICBnb3RvIHNlbGVjdG9yX2xlYXZlOwogCSAgICB9Ci0JICAgIAorCiAJICAgIGZvciAoaSA9IDA7IGkgPCBuYktleXM7IGkrKykgewogCQlpZiAoKCprZXlTZXEpW2ldID09IE5VTEwpIHsKIAkJICAgIC8qCkBAIC0yMjg1OSwxOCArMjI4NjMsMTggQEAKIAkJCSogQWxsIGZpZWxkcyBvZiBhICJrZXkiIElEQyBtdXN0IHJlc29sdmUuCiAJCQkqLwogCQkJZ290byBzZWxlY3Rvcl9rZXlfZXJyb3I7Ci0JCSAgICB9CQkgICAgCisJCSAgICB9CiAJCSAgICBnb3RvIHNlbGVjdG9yX2xlYXZlOwogCQl9CiAJICAgIH0KIAkgICAgLyoKIAkgICAgKiBBbGwgZmllbGRzIGRpZCByZXNvbHZlLgogCSAgICAqLwotCSAgICAKKwogCSAgICAvKgogCSAgICAqIDQuMSBJZiB0aGUge2lkZW50aXR5LWNvbnN0cmFpbnQgY2F0ZWdvcnl9IGlzIHVuaXF1ZSgva2V5KSwKLQkgICAgKiB0aGVuIG5vIHR3byBtZW1iZXJzIG9mIHRoZSC3cXVhbGlmaWVkIG5vZGUgc2V0tyBoYXZlCi0JICAgICogt2tleS1zZXF1ZW5jZXO3IHdob3NlIG1lbWJlcnMgYXJlIHBhaXJ3aXNlIGVxdWFsLCBhcworCSAgICAqIHRoZW4gbm8gdHdvIG1lbWJlcnMgb2YgdGhlIO+/vXF1YWxpZmllZCBub2RlIHNldO+/vSBoYXZlCisJICAgICog77+9a2V5LXNlcXVlbmNlc++/vSB3aG9zZSBtZW1iZXJzIGFyZSBwYWlyd2lzZSBlcXVhbCwgYXMKIAkgICAgKiBkZWZpbmVkIGJ5IEVxdWFsIGluIFtYTUwgU2NoZW1hczogRGF0YXR5cGVzXS4KIAkgICAgKgogCSAgICAqIEdldCB0aGUgSURDIGJpbmRpbmcgZnJvbSB0aGUgbWF0Y2hlciBhbmQgY2hlY2sgZm9yCkBAIC0yMjg4MCwxMCArMjI4ODQsMTAgQEAKIAkgICAgYmluZCA9IHhtbFNjaGVtYUlEQ0FjcXVpcmVCaW5kaW5nKHZjdHh0LCBtYXRjaGVyKTsKICNlbmRpZgogCSAgICB0YXJnZXRzID0geG1sU2NoZW1hSURDQWNxdWlyZVRhcmdldExpc3QodmN0eHQsIG1hdGNoZXIpOwotCSAgICBpZiAoKGlkYy0+dHlwZSAhPSBYTUxfU0NIRU1BX1RZUEVfSURDX0tFWVJFRikgJiYgCisJICAgIGlmICgoaWRjLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9JRENfS0VZUkVGKSAmJgogCQkodGFyZ2V0cy0+bmJJdGVtcyAhPSAwKSkgewogCQl4bWxTY2hlbWFQU1ZJSURDS2V5UHRyIGNrZXksIGJrZXksICpia2V5U2VxOwotCQkKKwogCQlpID0gMDsKIAkJcmVzID0gMDsKIAkJLyoKQEAgLTIyODk0LDcgKzIyODk4LDcgQEAKIAkJCSgoeG1sU2NoZW1hUFNWSUlEQ05vZGVQdHIpIHRhcmdldHMtPml0ZW1zW2ldKS0+a2V5czsKIAkJICAgIGZvciAoaiA9IDA7IGogPCBuYktleXM7IGorKykgewogCQkJY2tleSA9ICgqa2V5U2VxKVtqXTsKLQkJCWJrZXkgPSBia2V5U2VxW2pdOwkJCQkJCQkKKwkJCWJrZXkgPSBia2V5U2VxW2pdOwogCQkJcmVzID0geG1sU2NoZW1hQXJlVmFsdWVzRXF1YWwoY2tleS0+dmFsLCBia2V5LT52YWwpOwogCQkJaWYgKHJlcyA9PSAtMSkgewogCQkJICAgIHJldHVybiAoLTEpOwpAQCAtMjI5MTYsMTAgKzIyOTIwLDEwIEBACiAJCX0gd2hpbGUgKGkgPCB0YXJnZXRzLT5uYkl0ZW1zKTsKIAkJaWYgKGkgIT0gdGFyZ2V0cy0+bmJJdGVtcykgewogCQkgICAgeG1sQ2hhciAqc3RyID0gTlVMTCwgKnN0ckIgPSBOVUxMOwotCQkgICAgLyogICAKKwkJICAgIC8qCiAJCSAgICAqIFRPRE86IFRyeSB0byByZXBvcnQgdGhlIGtleS1zZXF1ZW5jZS4KIAkJICAgICovCi0JCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwgCisJCSAgICB4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwKIAkJCVhNTF9TQ0hFTUFWX0NWQ19JREMsIE5VTEwsCiAJCQlXWFNfQkFTSUNfQ0FTVCBpZGMsCiAJCQkiRHVwbGljYXRlIGtleS1zZXF1ZW5jZSAlcyBpbiAlcyIsCkBAIC0yMjkzNywxNSArMjI5NDEsMTUgQEAKIAkgICAgbnRJdGVtID0gKHhtbFNjaGVtYVBTVklJRENOb2RlUHRyKSB4bWxNYWxsb2MoCiAJCXNpemVvZih4bWxTY2hlbWFQU1ZJSURDTm9kZSkpOwogCSAgICBpZiAobnRJdGVtID09IE5VTEwpIHsKLQkJeG1sU2NoZW1hVkVyck1lbW9yeShOVUxMLCAKKwkJeG1sU2NoZW1hVkVyck1lbW9yeShOVUxMLAogCQkgICAgImFsbG9jYXRpbmcgYW4gSURDIG5vZGUtdGFibGUgaXRlbSIsIE5VTEwpOwogCQl4bWxGcmVlKCprZXlTZXEpOwogCQkqa2V5U2VxID0gTlVMTDsKIAkJcmV0dXJuKC0xKTsKLQkgICAgfQkKKwkgICAgfQogCSAgICBtZW1zZXQobnRJdGVtLCAwLCBzaXplb2YoeG1sU2NoZW1hUFNWSUlEQ05vZGUpKTsKLQkgICAgCi0JICAgIC8qIAorCisJICAgIC8qCiAJICAgICogU3RvcmUgdGhlIG5vZGUtdGFibGUgaXRlbSBpbiBhIGdsb2JhbCBsaXN0LgogCSAgICAqLwogCSAgICBpZiAoaWRjLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9JRENfS0VZUkVGKSB7CkBAIC0yMjk2Nyw3ICsyMjk3MSw3IEBACiAJCSAgICB4bWxGcmVlKG50SXRlbSk7CiAJCSAgICB4bWxGcmVlKCprZXlTZXEpOwogCQkgICAgKmtleVNlcSA9IE5VTEw7Ci0JCSAgICByZXR1cm4gKC0xKTsJCSAgICAKKwkJICAgIHJldHVybiAoLTEpOwogCQl9CiAJICAgIH0KIAkgICAgLyoKQEAgLTIyOTc5LDExICsyMjk4MywxMSBAQAogCSAgICBudEl0ZW0tPmtleXMgPSAqa2V5U2VxOwogCSAgICAqa2V5U2VxID0gTlVMTDsKICNpZiAwCi0JICAgIGlmICh4bWxTY2hlbWFJRENBcHBlbmROb2RlVGFibGVJdGVtKGJpbmQsIG50SXRlbSkgPT0gLTEpIHsKKwkgICAgaWYgKHhtbFNjaGVtYUlEQ0FwcGVuZE5vZGVUYWJsZUl0ZW0oYmluZCwgbnRJdGVtKSA9PSAtMSkKICNlbmRpZgogCSAgICBpZiAoeG1sU2NoZW1hSXRlbUxpc3RBZGQodGFyZ2V0cywgbnRJdGVtKSA9PSAtMSkgewogCQlpZiAoaWRjLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9JRENfS0VZUkVGKSB7Ci0JCSAgICAvKiAKKwkJICAgIC8qCiAJCSAgICAqIEZyZWUgdGhlIGl0ZW0sIHNpbmNlIGtleXJlZiBpdGVtcyB3b24ndCBiZQogCQkgICAgKiBwdXQgb24gYSBnbG9iYWwgbGlzdC4KIAkJICAgICovCkBAIC0yMjk5MiwxOCArMjI5OTYsMTggQEAKIAkJfQogCQlyZXR1cm4gKC0xKTsKIAkgICAgfQotCSAgICAKKwogCSAgICBnb3RvIHNlbGVjdG9yX2xlYXZlOwogc2VsZWN0b3Jfa2V5X2Vycm9yOgogCSAgICB7CiAJCXhtbENoYXIgKnN0ciA9IE5VTEw7CiAJCS8qCi0JCSogNC4yLjEgKEtFWSkgVGhlILd0YXJnZXQgbm9kZSBzZXS3IGFuZCB0aGUgCi0JCSogt3F1YWxpZmllZCBub2RlIHNldLcgYXJlIGVxdWFsLCB0aGF0IGlzLCBldmVyeSAKLQkJKiBtZW1iZXIgb2YgdGhlILd0YXJnZXQgbm9kZSBzZXS3IGlzIGFsc28gYSBtZW1iZXIKLQkJKiBvZiB0aGUgt3F1YWxpZmllZCBub2RlIHNldLcgYW5kIHZpY2UgdmVyc2EuCisJCSogNC4yLjEgKEtFWSkgVGhlIO+/vXRhcmdldCBub2RlIHNldO+/vSBhbmQgdGhlCisJCSog77+9cXVhbGlmaWVkIG5vZGUgc2V077+9IGFyZSBlcXVhbCwgdGhhdCBpcywgZXZlcnkKKwkJKiBtZW1iZXIgb2YgdGhlIO+/vXRhcmdldCBub2RlIHNldO+/vSBpcyBhbHNvIGEgbWVtYmVyCisJCSogb2YgdGhlIO+/vXF1YWxpZmllZCBub2RlIHNldO+/vSBhbmQgdmljZSB2ZXJzYS4KIAkJKi8KLQkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgdmN0eHQsIAorCQl4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwKIAkJICAgIFhNTF9TQ0hFTUFWX0NWQ19JREMsIE5VTEwsCiAJCSAgICBXWFNfQkFTSUNfQ0FTVCBpZGMsCiAJCSAgICAiTm90IGFsbCBmaWVsZHMgb2YgJXMgZXZhbHVhdGUgdG8gYSBub2RlIiwKQEAgLTIzMDE5LDcgKzIzMDIzLDcgQEAKIAkJKmtleVNlcSA9IE5VTEw7CiAJICAgIH0KIAl9IC8qIGlmIHNlbGVjdG9yICovCi0JCisKIAlzdG8tPm5iSGlzdG9yeS0tOwogCiBkZXJlZ2lzdGVyX2NoZWNrOgpAQCAtMjMwNzAsMTUgKzIzMDc0LDE1IEBACiAgICAgeG1sU2NoZW1hSURDTWF0Y2hlclB0ciBtYXRjaGVyLCBsYXN0ID0gTlVMTDsKICAgICB4bWxTY2hlbWFJRENQdHIgaWRjLCByZWZJZGM7CiAgICAgeG1sU2NoZW1hSURDQXVnUHRyIGFpZGM7Ci0gICAgICAgIAorCiAgICAgaWRjID0gKHhtbFNjaGVtYUlEQ1B0cikgZWxlbURlY2wtPmlkY3M7CiAgICAgaWYgKGlkYyA9PSBOVUxMKQogCXJldHVybiAoMCk7Ci0gICAgCisKICNpZmRlZiBERUJVR19JREMKICAgICB7CiAJeG1sQ2hhciAqc3RyID0gTlVMTDsKLQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgCisJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCiAJICAgICJJREM6IFJFR0lTVEVSIG9uICVzLCBkZXB0aCAlZFxuIiwKIAkgICAgKGNoYXIgKikgeG1sU2NoZW1hRm9ybWF0UU5hbWUoJnN0ciwgdmN0eHQtPmlub2RlLT5uc05hbWUsCiAJCXZjdHh0LT5pbm9kZS0+bG9jYWxOYW1lKSwgdmN0eHQtPmRlcHRoKTsKQEAgLTIzMTE5LDcgKzIzMTIzLDcgQEAKIAkJCSJDb3VsZCBub3QgZmluZCBhbiBhdWdtZW50ZWQgSURDIGl0ZW0gZm9yIGFuIElEQyAiCiAJCQkiZGVmaW5pdGlvbiIpOwogCQkgICAgcmV0dXJuICgtMSk7Ci0JCX0JCQorCQl9CiAJCWlmICgoYWlkYy0+a2V5cmVmRGVwdGggPT0gLTEpIHx8CiAJCSAgICAodmN0eHQtPmRlcHRoIDwgYWlkYy0+a2V5cmVmRGVwdGgpKQogCQkgICAgYWlkYy0+a2V5cmVmRGVwdGggPSB2Y3R4dC0+ZGVwdGg7CkBAIC0yMzE1MCwxMCArMjMxNTQsMTAgQEAKIAkgICAgdmN0eHQtPmlkY01hdGNoZXJDYWNoZSA9IG1hdGNoZXItPm5leHRDYWNoZWQ7CiAJICAgIG1hdGNoZXItPm5leHRDYWNoZWQgPSBOVUxMOwogCX0gZWxzZSB7Ci0JICAgIG1hdGNoZXIgPSAoeG1sU2NoZW1hSURDTWF0Y2hlclB0cikgCisJICAgIG1hdGNoZXIgPSAoeG1sU2NoZW1hSURDTWF0Y2hlclB0cikKIAkJeG1sTWFsbG9jKHNpemVvZih4bWxTY2hlbWFJRENNYXRjaGVyKSk7CiAJICAgIGlmIChtYXRjaGVyID09IE5VTEwpIHsKLQkJeG1sU2NoZW1hVkVyck1lbW9yeSh2Y3R4dCwgCisJCXhtbFNjaGVtYVZFcnJNZW1vcnkodmN0eHQsCiAJCSAgICAiYWxsb2NhdGluZyBhbiBJREMgbWF0Y2hlciIsIE5VTEwpOwogCQlyZXR1cm4gKC0xKTsKIAkgICAgfQpAQCAtMjMxNjYsMTYgKzIzMTcwLDE2IEBACiAJbGFzdCA9IG1hdGNoZXI7CiAKIAltYXRjaGVyLT50eXBlID0gSURDX01BVENIRVI7Ci0JbWF0Y2hlci0+ZGVwdGggPSB2Y3R4dC0+ZGVwdGg7CQorCW1hdGNoZXItPmRlcHRoID0gdmN0eHQtPmRlcHRoOwogCW1hdGNoZXItPmFpZGMgPSBhaWRjOwogCW1hdGNoZXItPmlkY1R5cGUgPSBhaWRjLT5kZWYtPnR5cGU7Ci0jaWZkZWYgREVCVUdfSURDCQorI2lmZGVmIERFQlVHX0lEQwogCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiSURDOiAgIHJlZ2lzdGVyIG1hdGNoZXJcbiIpOwotI2VuZGlmIAorI2VuZGlmCiAJLyoKLQkqIEluaXQgdGhlIGF1dG9tYXRvbiBzdGF0ZSBvYmplY3QuIAorCSogSW5pdCB0aGUgYXV0b21hdG9uIHN0YXRlIG9iamVjdC4KIAkqLwotCWlmICh4bWxTY2hlbWFJRENBZGRTdGF0ZU9iamVjdCh2Y3R4dCwgbWF0Y2hlciwgCisJaWYgKHhtbFNjaGVtYUlEQ0FkZFN0YXRlT2JqZWN0KHZjdHh0LCBtYXRjaGVyLAogCSAgICBpZGMtPnNlbGVjdG9yLCBYUEFUSF9TVEFURV9PQkpfVFlQRV9JRENfU0VMRUNUT1IpID09IC0xKQogCSAgICByZXR1cm4gKC0xKTsKIApAQCAtMjMxOTIsNyArMjMxOTYsNyBAQAogICAgIGludCByZXMsIGksIGosIGssIG5iVGFyZ2V0cywgbmJGaWVsZHMsIG5iRHVwbHMsIG5iTm9kZVRhYmxlOwogICAgIHhtbFNjaGVtYVBTVklJRENLZXlQdHIgKmtleXMsICpudGtleXM7CiAgICAgeG1sU2NoZW1hUFNWSUlEQ05vZGVQdHIgKnRhcmdldHMsICpkdXBsczsKLSAgICAKKwogICAgIHhtbFNjaGVtYUlEQ01hdGNoZXJQdHIgbWF0Y2hlciA9IGllbGVtLT5pZGNNYXRjaGVyczsKICAgICAvKiB2Y3R4dC0+Y3JlYXRlSURDTm9kZVRhYmxlcyAqLwogICAgIHdoaWxlIChtYXRjaGVyICE9IE5VTEwpIHsKQEAgLTIzMjI2LDcgKzIzMjMwLDcgQEAKIAkgICAgbmJEdXBscyA9IGJpbmQtPmR1cGxzLT5uYkl0ZW1zOwogCX0gZWxzZSB7CiAJICAgIGR1cGxzID0gTlVMTDsKLQkgICAgbmJEdXBscyA9IDA7CSAgICAKKwkgICAgbmJEdXBscyA9IDA7CiAJfQogCWlmIChiaW5kLT5ub2RlVGFibGUgIT0gTlVMTCkgewogCSAgICBuYk5vZGVUYWJsZSA9IGJpbmQtPm5iTm9kZXM7CkBAIC0yMzIzOSwyOSArMjMyNDMsMjkgQEAKIAkgICAgKiBUcmFuc2ZlciBhbGwgSURDIHRhcmdldC1ub2RlcyB0byB0aGUgSURDIG5vZGUtdGFibGUuCiAJICAgICovCiAJICAgIGJpbmQtPm5vZGVUYWJsZSA9Ci0JCSh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKSBtYXRjaGVyLT50YXJnZXRzLT5pdGVtczsJCQorCQkoeG1sU2NoZW1hUFNWSUlEQ05vZGVQdHIgKikgbWF0Y2hlci0+dGFyZ2V0cy0+aXRlbXM7CiAJICAgIGJpbmQtPnNpemVOb2RlcyA9IG1hdGNoZXItPnRhcmdldHMtPnNpemVJdGVtczsKIAkgICAgYmluZC0+bmJOb2RlcyA9IG1hdGNoZXItPnRhcmdldHMtPm5iSXRlbXM7CiAKIAkgICAgbWF0Y2hlci0+dGFyZ2V0cy0+aXRlbXMgPSBOVUxMOwogCSAgICBtYXRjaGVyLT50YXJnZXRzLT5zaXplSXRlbXMgPSAwOwotCSAgICBtYXRjaGVyLT50YXJnZXRzLT5uYkl0ZW1zID0gMDsJICAgIAorCSAgICBtYXRjaGVyLT50YXJnZXRzLT5uYkl0ZW1zID0gMDsKIAl9IGVsc2UgewogCSAgICAvKgogCSAgICAqIENvbXBhcmUgdGhlIGtleS1zZXF1ZW5jZXMgYW5kIGFkZCB0byB0aGUgSURDIG5vZGUtdGFibGUuCiAJICAgICovCiAJICAgIG5iVGFyZ2V0cyA9IG1hdGNoZXItPnRhcmdldHMtPm5iSXRlbXM7Ci0JICAgIHRhcmdldHMgPSAoeG1sU2NoZW1hUFNWSUlEQ05vZGVQdHIgKikgbWF0Y2hlci0+dGFyZ2V0cy0+aXRlbXM7CQorCSAgICB0YXJnZXRzID0gKHhtbFNjaGVtYVBTVklJRENOb2RlUHRyICopIG1hdGNoZXItPnRhcmdldHMtPml0ZW1zOwogCSAgICBuYkZpZWxkcyA9IG1hdGNoZXItPmFpZGMtPmRlZi0+bmJGaWVsZHM7CiAJICAgIGkgPSAwOwogCSAgICBkbyB7CiAJCWtleXMgPSB0YXJnZXRzW2ldLT5rZXlzOwotCQlpZiAobmJEdXBscykgewkJCQorCQlpZiAobmJEdXBscykgewogCQkgICAgLyoKIAkJICAgICogU2VhcmNoIGluIGFscmVhZHkgZm91bmQgZHVwbGljYXRlcyBmaXJzdC4KIAkJICAgICovCiAJCSAgICBqID0gMDsKLQkJICAgIGRvIHsJCQkJCQkKKwkJICAgIGRvIHsKIAkJCWlmIChuYkZpZWxkcyA9PSAxKSB7CiAJCQkgICAgcmVzID0geG1sU2NoZW1hQXJlVmFsdWVzRXF1YWwoa2V5c1swXS0+dmFsLAogCQkJCWR1cGxzW2pdLT5rZXlzWzBdLT52YWwpOwpAQCAtMjMyOTYsMTEgKzIzMzAwLDExIEBACiAJCQkgICAgfQogCQkJfQogCQkJaisrOwotCQkgICAgfSB3aGlsZSAoaiA8IG5iRHVwbHMpOwkJICAgIAorCQkgICAgfSB3aGlsZSAoaiA8IG5iRHVwbHMpOwogCQl9CiAJCWlmIChuYk5vZGVUYWJsZSkgewogCQkgICAgaiA9IDA7Ci0JCSAgICBkbyB7CQkJCQkJCisJCSAgICBkbyB7CiAJCQlpZiAobmJGaWVsZHMgPT0gMSkgewogCQkJICAgIHJlcyA9IHhtbFNjaGVtYUFyZVZhbHVlc0VxdWFsKGtleXNbMF0tPnZhbCwKIAkJCQliaW5kLT5ub2RlVGFibGVbal0tPmtleXNbMF0tPnZhbCk7CkBAIC0yMzMyNyw3ICsyMzMzMSw3IEBACiAJCQkJICAgIGdvdG8gbmV4dF9ub2RlX3RhYmxlX2VudHJ5OwogCQkJCX0KIAkJCSAgICB9Ci0JCQl9CQkJCisJCQl9CiAJCQkvKgogCQkJKiBBZGQgdGhlIGR1cGxpY2F0ZSB0byB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLgogCQkJKi8KQEAgLTIzMzM1LDcgKzIzMzM5LDcgQEAKIAkJCSAgICBiaW5kLT5kdXBscyA9IHhtbFNjaGVtYUl0ZW1MaXN0Q3JlYXRlKCk7CiAJCQkgICAgaWYgKGJpbmQtPmR1cGxzID09IE5VTEwpCiAJCQkJZ290byBpbnRlcm5hbF9lcnJvcjsKLQkJCX0JCSAgICAKKwkJCX0KIAkJCWlmICh4bWxTY2hlbWFJdGVtTGlzdEFkZChiaW5kLT5kdXBscywgYmluZC0+bm9kZVRhYmxlW2pdKSA9PSAtMSkKIAkJCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwogCQkJLyoKQEAgLTIzMzcwLDEyICsyMzM3NCwxMiBAQAogfQogCiAvKioKLSAqIHhtbFNjaGVtYUJ1YmJsZUlEQ05vZGVUYWJsZXM6IAorICogeG1sU2NoZW1hQnViYmxlSURDTm9kZVRhYmxlczoKICAqIEBkZXB0aDogdGhlIGN1cnJlbnQgdHJlZSBkZXB0aAogICoKLSAqIE1lcmdlcyBJREMgYmluZGluZ3Mgb2YgYW4gZWxlbWVudCBhdCBAZGVwdGggaW50byB0aGUgY29ycmVzcG9uZGluZyBJREMgCi0gKiBiaW5kaW5ncyBvZiBpdHMgcGFyZW50IGVsZW1lbnQuIElmIGEgZHVwbGljYXRlIG5vdGUtdGFibGUgZW50cnkgaXMgZm91bmQsIAotICogYm90aCwgdGhlIHBhcmVudCBub2RlLXRhYmxlIGVudHJ5IGFuZCBjaGlsZCBlbnRyeSBhcmUgZGlzY2FyZGVkIGZyb20gdGhlIAorICogTWVyZ2VzIElEQyBiaW5kaW5ncyBvZiBhbiBlbGVtZW50IGF0IEBkZXB0aCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIElEQworICogYmluZGluZ3Mgb2YgaXRzIHBhcmVudCBlbGVtZW50LiBJZiBhIGR1cGxpY2F0ZSBub3RlLXRhYmxlIGVudHJ5IGlzIGZvdW5kLAorICogYm90aCwgdGhlIHBhcmVudCBub2RlLXRhYmxlIGVudHJ5IGFuZCBjaGlsZCBlbnRyeSBhcmUgZGlzY2FyZGVkIGZyb20gdGhlCiAgKiBub2RlLXRhYmxlIG9mIHRoZSBwYXJlbnQuCiAgKgogICogUmV0dXJucyAwIGlmIE9LIGFuZCAtMSBvbiBpbnRlcm5hbCBlcnJvcnMuCkBAIC0yMzM4OSwxOSArMjMzOTMsMTkgQEAKICAgICB4bWxTY2hlbWFJRENBdWdQdHIgYWlkYzsKICAgICBpbnQgaSwgaiwgaywgcmV0ID0gMCwgbmJGaWVsZHMsIG9sZE51bSwgb2xkRHVwbHM7CiAKLSAgICBiaW5kID0gdmN0eHQtPmlub2RlLT5pZGNUYWJsZTsgICAgICAgIAorICAgIGJpbmQgPSB2Y3R4dC0+aW5vZGUtPmlkY1RhYmxlOwogICAgIGlmIChiaW5kID09IE5VTEwpIHsKIAkvKiBGaW5lLCBubyB0YWJsZSwgbm8gYnViYmxlcy4gKi8KIAlyZXR1cm4gKDApOwogICAgIH0KLSAgICAKKwogICAgIHBhclRhYmxlID0gJih2Y3R4dC0+ZWxlbUluZm9zW3ZjdHh0LT5kZXB0aCAtMV0tPmlkY1RhYmxlKTsKICAgICAvKgogICAgICogV2FsayBhbGwgYmluZGluZ3M7IGNyZWF0ZSBuZXcgb3IgYWRkIHRvIGV4aXN0aW5nIGJpbmRpbmdzLgogICAgICogUmVtb3ZlIGR1cGxpY2F0ZSBrZXktc2VxdWVuY2VzLgogICAgICovCiAgICAgd2hpbGUgKGJpbmQgIT0gTlVMTCkgewotCQorCiAJaWYgKChiaW5kLT5uYk5vZGVzID09IDApICYmIFdYU19JTElTVF9JU19FTVBUWShiaW5kLT5kdXBscykpCiAJICAgIGdvdG8gbmV4dF9iaW5kaW5nOwogCS8qCkBAIC0yMzQxMSw3ICsyMzQxNSw3IEBACiAJICAgIGFpZGMgPSB2Y3R4dC0+YWlkY3M7CiAJICAgIGRvIHsKIAkJaWYgKGFpZGMtPmRlZiA9PSBiaW5kLT5kZWZpbml0aW9uKSB7Ci0JCSAgICBpZiAoKGFpZGMtPmtleXJlZkRlcHRoID09IC0xKSB8fCAKKwkJICAgIGlmICgoYWlkYy0+a2V5cmVmRGVwdGggPT0gLTEpIHx8CiAJCQkoYWlkYy0+a2V5cmVmRGVwdGggPj0gdmN0eHQtPmRlcHRoKSkgewogCQkJZ290byBuZXh0X2JpbmRpbmc7CiAJCSAgICB9CkBAIC0yMzQyNyw3ICsyMzQzMSw3IEBACiAJKiBTZWFyY2ggYSBtYXRjaGluZyBwYXJlbnQgYmluZGluZyBmb3IgdGhlCiAJKiBJREMgZGVmaW5pdGlvbi4KIAkqLwotCXdoaWxlIChwYXJCaW5kICE9IE5VTEwpIHsJICAgIAorCXdoaWxlIChwYXJCaW5kICE9IE5VTEwpIHsKIAkgICAgaWYgKHBhckJpbmQtPmRlZmluaXRpb24gPT0gYmluZC0+ZGVmaW5pdGlvbikKIAkJYnJlYWs7CiAJICAgIHBhckJpbmQgPSBwYXJCaW5kLT5uZXh0OwpAQCAtMjM0MzUsNyArMjM0MzksNyBAQAogCiAJaWYgKHBhckJpbmQgIT0gTlVMTCkgewogCSAgICAvKgotCSAgICAqIENvbXBhcmUgZXZlcnkgbm9kZS10YWJsZSBlbnRyeSBvZiB0aGUgY2hpbGQgbm9kZSwgCisJICAgICogQ29tcGFyZSBldmVyeSBub2RlLXRhYmxlIGVudHJ5IG9mIHRoZSBjaGlsZCBub2RlLAogCSAgICAqIGkuZS4gdGhlIGtleS1zZXF1ZW5jZSB3aXRoaW4sIC4uLgogCSAgICAqLwogCSAgICBvbGROdW0gPSBwYXJCaW5kLT5uYk5vZGVzOyAvKiBTa2lwIG5ld2x5IGFkZGVkIGl0ZW1zLiAqLwpAQCAtMjM0NDUsMTIgKzIzNDQ5LDEyIEBACiAJCWR1cGxzID0gKHhtbFNjaGVtYVBTVklJRENOb2RlUHRyICopIHBhckJpbmQtPmR1cGxzLT5pdGVtczsKIAkgICAgfSBlbHNlIHsKIAkJZHVwbHMgPSBOVUxMOwotCQlvbGREdXBscyA9IDA7CQkKKwkJb2xkRHVwbHMgPSAwOwogCSAgICB9Ci0JICAgIAorCiAJICAgIHBhck5vZGVzID0gcGFyQmluZC0+bm9kZVRhYmxlOwogCSAgICBuYkZpZWxkcyA9IGJpbmQtPmRlZmluaXRpb24tPm5iRmllbGRzOwotCSAgICAKKwogCSAgICBmb3IgKGkgPSAwOyBpIDwgYmluZC0+bmJOb2RlczsgaSsrKSB7CiAJCW5vZGUgPSBiaW5kLT5ub2RlVGFibGVbaV07CiAJCWlmIChub2RlID09IE5VTEwpCkBAIC0yMzQ2MCw3ICsyMzQ2NCw3IEBACiAJCSogZXZhbHVhdGVkIHRvIGJlIGEgZHVwbGljYXRlIGtleS1zZXF1ZW5jZS4KIAkJKi8KIAkJaWYgKG9sZER1cGxzKSB7Ci0JCSAgICBqID0gMDsgCisJCSAgICBqID0gMDsKIAkJICAgIHdoaWxlIChqIDwgb2xkRHVwbHMpIHsKIAkJCWlmIChuYkZpZWxkcyA9PSAxKSB7CiAJCQkgICAgcmV0ID0geG1sU2NoZW1hQXJlVmFsdWVzRXF1YWwoCkBAIC0yMzQ5MywxMiArMjM0OTcsMTIgQEAKIAkJCS8qIER1cGxpY2F0ZSBmb3VuZC4gU2tpcCB0aGlzIGVudHJ5LiAqLwogCQkJY29udGludWU7CiAJCSAgICB9Ci0JCX0JCSAgICAKKwkJfQogCQkvKgogCQkqIC4uLiBhbmQgd2l0aCBldmVyeSBrZXktc2VxdWVuY2Ugb2YgdGhlIHBhcmVudCBub2RlLgogCQkqLwogCQlpZiAob2xkTnVtKSB7Ci0JCSAgICBqID0gMDsgCisJCSAgICBqID0gMDsKIAkJICAgIHdoaWxlIChqIDwgb2xkTnVtKSB7CiAJCQlwYXJOb2RlID0gcGFyTm9kZXNbal07CiAJCQlpZiAobmJGaWVsZHMgPT0gMSkgewpAQCAtMjM1MTEsNyArMjM1MTUsNyBAQAogCQkJCWorKzsKIAkJCQljb250aW51ZTsKIAkJCSAgICB9Ci0JCQl9IGVsc2UgewkJCSAgICAKKwkJCX0gZWxzZSB7CiAJCQkgICAgZm9yIChrID0gMDsgayA8IG5iRmllbGRzOyBrKyspIHsKIAkJCQlyZXQgPSB4bWxTY2hlbWFBcmVWYWx1ZXNFcXVhbCgKIAkJCQkgICAgbm9kZS0+a2V5c1trXS0+dmFsLApAQCAtMjM1MzIsMjAgKzIzNTM2LDIwIEBACiAJCQkqIEhhbmRsZSBkdXBsaWNhdGVzLiBNb3ZlIHRoZSBkdXBsaWNhdGUgaW4KIAkJCSogdGhlIHBhcmVudCdzIG5vZGUtdGFibGUgdG8gdGhlIGxpc3Qgb2YKIAkJCSogZHVwbGljYXRlcy4KLQkJCSovCQkJCisJCQkqLwogCQkJb2xkTnVtLS07CiAJCQlwYXJCaW5kLT5uYk5vZGVzLS07CiAJCQkvKgogCQkJKiBNb3ZlIGxhc3Qgb2xkIGl0ZW0gdG8gcG9zIG9mIGR1cGxpY2F0ZS4KIAkJCSovCiAJCQlwYXJOb2Rlc1tqXSA9IHBhck5vZGVzW29sZE51bV07Ci0JCQkKKwogCQkJaWYgKHBhckJpbmQtPm5iTm9kZXMgIT0gb2xkTnVtKSB7CiAJCQkgICAgLyoKLQkJCSAgICAqIElmIG5ldyBpdGVtcyBleGlzdCwgbW92ZSBsYXN0IG5ldyBpdGVtIHRvIAorCQkJICAgICogSWYgbmV3IGl0ZW1zIGV4aXN0LCBtb3ZlIGxhc3QgbmV3IGl0ZW0gdG8KIAkJCSAgICAqIGxhc3Qgb2Ygb2xkIGl0ZW1zLgogCQkJICAgICovCi0JCQkgICAgcGFyTm9kZXNbb2xkTnVtXSA9IAorCQkJICAgIHBhck5vZGVzW29sZE51bV0gPQogCQkJCXBhck5vZGVzW3BhckJpbmQtPm5iTm9kZXNdOwogCQkJfQogCQkJaWYgKHBhckJpbmQtPmR1cGxzID09IE5VTEwpIHsKQEAgLTIzNTUzLDMxICsyMzU1NywzMSBAQAogCQkJICAgIGlmIChwYXJCaW5kLT5kdXBscyA9PSBOVUxMKQogCQkJCWdvdG8gaW50ZXJuYWxfZXJyb3I7CiAJCQl9Ci0JCQl4bWxTY2hlbWFJdGVtTGlzdEFkZChwYXJCaW5kLT5kdXBscywgcGFyTm9kZSk7CQkJCisJCQl4bWxTY2hlbWFJdGVtTGlzdEFkZChwYXJCaW5kLT5kdXBscywgcGFyTm9kZSk7CiAJCSAgICB9IGVsc2UgewogCQkJLyoKLQkJCSogQWRkIHRoZSBub2RlLXRhYmxlIGVudHJ5IChub2RlIGFuZCBrZXktc2VxdWVuY2UpIG9mIAorCQkJKiBBZGQgdGhlIG5vZGUtdGFibGUgZW50cnkgKG5vZGUgYW5kIGtleS1zZXF1ZW5jZSkgb2YKIAkJCSogdGhlIGNoaWxkIG5vZGUgdG8gdGhlIG5vZGUgdGFibGUgb2YgdGhlIHBhcmVudCBub2RlLgogCQkJKi8KLQkJCWlmIChwYXJCaW5kLT5ub2RlVGFibGUgPT0gTlVMTCkgewkJCQotCQkJICAgIHBhckJpbmQtPm5vZGVUYWJsZSA9ICh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKSAKKwkJCWlmIChwYXJCaW5kLT5ub2RlVGFibGUgPT0gTlVMTCkgeworCQkJICAgIHBhckJpbmQtPm5vZGVUYWJsZSA9ICh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKQogCQkJCXhtbE1hbGxvYygxMCAqIHNpemVvZih4bWxTY2hlbWFQU1ZJSURDTm9kZVB0cikpOwogCQkJICAgIGlmIChwYXJCaW5kLT5ub2RlVGFibGUgPT0gTlVMTCkgewotCQkJCXhtbFNjaGVtYVZFcnJNZW1vcnkoTlVMTCwgCisJCQkJeG1sU2NoZW1hVkVyck1lbW9yeShOVUxMLAogCQkJCSAgICAiYWxsb2NhdGluZyBJREMgbGlzdCBvZiBub2RlLXRhYmxlIGl0ZW1zIiwgTlVMTCk7CiAJCQkJZ290byBpbnRlcm5hbF9lcnJvcjsKIAkJCSAgICB9CiAJCQkgICAgcGFyQmluZC0+c2l6ZU5vZGVzID0gMTsKIAkJCX0gZWxzZSBpZiAocGFyQmluZC0+bmJOb2RlcyA+PSBwYXJCaW5kLT5zaXplTm9kZXMpIHsKIAkJCSAgICBwYXJCaW5kLT5zaXplTm9kZXMgKj0gMjsKLQkJCSAgICBwYXJCaW5kLT5ub2RlVGFibGUgPSAoeG1sU2NoZW1hUFNWSUlEQ05vZGVQdHIgKikgCi0JCQkJeG1sUmVhbGxvYyhwYXJCaW5kLT5ub2RlVGFibGUsIHBhckJpbmQtPnNpemVOb2RlcyAqIAorCQkJICAgIHBhckJpbmQtPm5vZGVUYWJsZSA9ICh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKQorCQkJCXhtbFJlYWxsb2MocGFyQmluZC0+bm9kZVRhYmxlLCBwYXJCaW5kLT5zaXplTm9kZXMgKgogCQkJCXNpemVvZih4bWxTY2hlbWFQU1ZJSURDTm9kZVB0cikpOwogCQkJICAgIGlmIChwYXJCaW5kLT5ub2RlVGFibGUgPT0gTlVMTCkgewotCQkJCXhtbFNjaGVtYVZFcnJNZW1vcnkoTlVMTCwgCisJCQkJeG1sU2NoZW1hVkVyck1lbW9yeShOVUxMLAogCQkJCSAgICAicmUtYWxsb2NhdGluZyBJREMgbGlzdCBvZiBub2RlLXRhYmxlIGl0ZW1zIiwgTlVMTCk7CiAJCQkJZ290byBpbnRlcm5hbF9lcnJvcjsKLQkJCSAgICB9CQkJICAgIAorCQkJICAgIH0KIAkJCX0KIAkJCXBhck5vZGVzID0gcGFyQmluZC0+bm9kZVRhYmxlOwogCQkJLyoKQEAgLTIzNTg3LDkgKzIzNTkxLDkgQEAKIAkJCXBhck5vZGVzW3BhckJpbmQtPm5iTm9kZXMrK10gPSBub2RlOwogCQkgICAgfQogCi0JCX0JCi0JCQotCSAgICB9CQorCQl9CisKKwkgICAgfQogCX0gZWxzZSB7CiAJICAgIC8qCiAJICAgICogTm8gYmluZGluZyBmb3IgdGhlIElEQyB3YXMgZm91bmQ6IGNyZWF0ZSBhIG5ldyBvbmUgYW5kCkBAIC0yMzU5OCw3ICsyMzYwMiw3IEBACiAJICAgIHBhckJpbmQgPSB4bWxTY2hlbWFJRENOZXdCaW5kaW5nKGJpbmQtPmRlZmluaXRpb24pOwogCSAgICBpZiAocGFyQmluZCA9PSBOVUxMKQogCQlnb3RvIGludGVybmFsX2Vycm9yOwotCSAgICAKKwogCSAgICAvKgogCSAgICAqIFRPRE86IEhtbSwgaG93IHRvIG9wdGltaXplIHRoZSBpbml0aWFsIG51bWJlciBvZgogCSAgICAqIGFsbG9jYXRlZCBlbnRyaWVzPwpAQCAtMjM2MjQsMTEgKzIzNjI4LDExIEBACiAJCSAgICAvKgogCQkgICAgKiBDb3B5IHRoZSBlbnRyaWVzLgogCQkgICAgKi8KLQkJICAgIHBhckJpbmQtPm5vZGVUYWJsZSA9ICh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKSAKKwkJICAgIHBhckJpbmQtPm5vZGVUYWJsZSA9ICh4bWxTY2hlbWFQU1ZJSURDTm9kZVB0ciAqKQogCQkJeG1sTWFsbG9jKGJpbmQtPm5iTm9kZXMgKgogCQkJc2l6ZW9mKHhtbFNjaGVtYVBTVklJRENOb2RlUHRyKSk7CiAJCSAgICBpZiAocGFyQmluZC0+bm9kZVRhYmxlID09IE5VTEwpIHsKLQkJCXhtbFNjaGVtYVZFcnJNZW1vcnkoTlVMTCwgCisJCQl4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsCiAJCQkgICAgImFsbG9jYXRpbmcgYW4gYXJyYXkgb2YgSURDIG5vZGUtdGFibGUgIgogCQkJICAgICJpdGVtcyIsIE5VTEwpOwogCQkJeG1sU2NoZW1hSURDRnJlZUJpbmRpbmcocGFyQmluZCk7CkBAIC0yMzY0NywxNSArMjM2NTEsMTUgQEAKIAkJaWYgKHBhckJpbmQtPmR1cGxzICE9IE5VTEwpCiAJCSAgICB4bWxTY2hlbWFJdGVtTGlzdEZyZWUocGFyQmluZC0+ZHVwbHMpOwogCQlwYXJCaW5kLT5kdXBscyA9IGJpbmQtPmR1cGxzOwotCQliaW5kLT5kdXBscyA9IE5VTEw7CQkKKwkJYmluZC0+ZHVwbHMgPSBOVUxMOwogCSAgICB9CiAJICAgIGlmICgqcGFyVGFibGUgPT0gTlVMTCkKIAkJKnBhclRhYmxlID0gcGFyQmluZDsKIAkgICAgZWxzZSB7CiAJCXBhckJpbmQtPm5leHQgPSAqcGFyVGFibGU7CiAJCSpwYXJUYWJsZSA9IHBhckJpbmQ7Ci0JICAgIH0JICAgCi0JfQkKKwkgICAgfQorCX0KIAogbmV4dF9iaW5kaW5nOgogCWJpbmQgPSBiaW5kLT5uZXh0OwpAQCAtMjM2NzgsNyArMjM2ODIsNyBAQAogewogICAgIHhtbFNjaGVtYUlEQ01hdGNoZXJQdHIgbWF0Y2hlcjsKICAgICB4bWxTY2hlbWFQU1ZJSURDQmluZGluZ1B0ciBiaW5kOwotICAgIAorCiAgICAgbWF0Y2hlciA9IHZjdHh0LT5pbm9kZS0+aWRjTWF0Y2hlcnM7CiAgICAgLyoKICAgICAqIEZpbmQgYSBrZXlyZWYuCkBAIC0yMzY5OSw3ICsyMzcwMyw3IEBACiAJICAgICovCiAJICAgIGJpbmQgPSB2Y3R4dC0+aW5vZGUtPmlkY1RhYmxlOwogCSAgICB3aGlsZSAoYmluZCAhPSBOVUxMKSB7Ci0JCWlmICgoeG1sU2NoZW1hSURDUHRyKSBtYXRjaGVyLT5haWRjLT5kZWYtPnJlZi0+aXRlbSA9PSAKKwkJaWYgKCh4bWxTY2hlbWFJRENQdHIpIG1hdGNoZXItPmFpZGMtPmRlZi0+cmVmLT5pdGVtID09CiAJCSAgICBiaW5kLT5kZWZpbml0aW9uKQogCQkgICAgYnJlYWs7CiAJCWJpbmQgPSBiaW5kLT5uZXh0OwpAQCAtMjM3NjgsNyArMjM3NzIsNyBAQAogCQkJfQogCQkgICAgfQogCQl9Ci0JCQorCiAJCWlmIChyZXMgPT0gMCkgewogCQkgICAgeG1sQ2hhciAqc3RyID0gTlVMTCwgKnN0ckIgPSBOVUxMOwogCQkgICAgeG1sU2NoZW1hS2V5cmVmRXJyKHZjdHh0LApAQCAtMjM4NTIsNyArMjM4NTYsNyBAQAogCQkJeG1sTm9kZVB0ciBhdHRyTm9kZSwKIAkJCWludCBub2RlTGluZSwKIAkJCWNvbnN0IHhtbENoYXIgKmxvY2FsTmFtZSwKLQkJCWNvbnN0IHhtbENoYXIgKm5zTmFtZSwJCQkKKwkJCWNvbnN0IHhtbENoYXIgKm5zTmFtZSwKIAkJCWludCBvd25lZE5hbWVzLAogCQkJeG1sQ2hhciAqdmFsdWUsCiAJCQlpbnQgb3duZWRWYWx1ZSkKQEAgLTIzODc4LDcgKzIzODgyLDcgQEAKICAgICBpZiAobnNOYW1lICE9IE5VTEwpIHsKIAlpZiAoeG1sU3RyRXF1YWwobG9jYWxOYW1lLCBCQURfQ0FTVCAibmlsIikpIHsKIAkgICAgaWYgKHhtbFN0ckVxdWFsKGF0dHItPm5zTmFtZSwgeG1sU2NoZW1hSW5zdGFuY2VOcykpIHsKLQkJYXR0ci0+bWV0YVR5cGUgPSBYTUxfU0NIRU1BX0FUVFJfSU5GT19NRVRBX1hTSV9OSUw7CQkKKwkJYXR0ci0+bWV0YVR5cGUgPSBYTUxfU0NIRU1BX0FUVFJfSU5GT19NRVRBX1hTSV9OSUw7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGxvY2FsTmFtZSwgQkFEX0NBU1QgInR5cGUiKSkgewogCSAgICBpZiAoeG1sU3RyRXF1YWwoYXR0ci0+bnNOYW1lLCB4bWxTY2hlbWFJbnN0YW5jZU5zKSkgewpAQCAtMjQwOTksNyArMjQxMDMsNyBAQAogCXZhbFR5cGUgPSB2YWxUeXBlOwogICAgIGVsc2UKIAl2YWxUeXBlID0geG1sU2NoZW1hR2V0VmFsVHlwZSh2YWwpOwotICAgIAorCiAgICAgcmV0ID0gMDsKICAgICBmb3IgKGZhY2V0TGluayA9IHR5cGUtPmZhY2V0U2V0OyBmYWNldExpbmsgIT0gTlVMTDsKIAlmYWNldExpbmsgPSBmYWNldExpbmstPm5leHQpIHsKQEAgLTI0MTQ4LDExICsyNDE1MiwxMSBAQAogICAgIHJldCA9IDA7CiAgICAgZm9yIChmYWNldExpbmsgPSB0eXBlLT5mYWNldFNldDsgZmFjZXRMaW5rICE9IE5VTEw7CiAJZmFjZXRMaW5rID0gZmFjZXRMaW5rLT5uZXh0KSB7Ci0JCisKIAlzd2l0Y2ggKGZhY2V0TGluay0+ZmFjZXQtPnR5cGUpIHsKIAkgICAgY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX0xFTkdUSDoKIAkgICAgY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX01JTkxFTkdUSDoKLQkgICAgY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX01BWExFTkdUSDoJCSAgICAKKwkgICAgY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX01BWExFTkdUSDoKIAkJcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVMaXN0U2ltcGxlVHlwZUZhY2V0KGZhY2V0TGluay0+ZmFjZXQsCiAJCSAgICB2YWx1ZSwgbGVuZ3RoLCBOVUxMKTsKIAkJYnJlYWs7CkBAIC0yNDE2NCw3ICsyNDE2OCw3IEBACiAJCSJ2YWxpZGF0aW5nIGFnYWluc3QgYSBsaXN0IHR5cGUgZmFjZXQiKTsKIAkgICAgcmV0dXJuICgtMSk7CiAJfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0JICAgIGlmIChmaXJlRXJyb3JzKQkJCisJICAgIGlmIChmaXJlRXJyb3JzKQogCQl4bWxTY2hlbWFGYWNldEVycihhY3R4dCwgcmV0LCBub2RlLAogCQl2YWx1ZSwgbGVuZ3RoLCB0eXBlLCBmYWNldExpbmstPmZhY2V0LCBOVUxMLCBOVUxMLCBOVUxMKTsKIAkgICAgZWxzZQpAQCAtMjQyNDEsNyArMjQyNDUsNyBAQAogCQlpZiAoZmFjZXRMaW5rLT5mYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1BBVFRFUk4pCiAJCSAgICBjb250aW51ZTsKIAkJZm91bmQgPSAxOwotCQkvKiAKKwkJLyoKIAkJKiBOT1RFIHRoYXQgZm9yIHBhdHRlcm5zLCBAdmFsdWUgbmVlZHMgdG8gYmUgdGhlCiAJCSogbm9ybWFsaXplZCB2YXVsZS4KIAkJKi8KQEAgLTI0MjUzLDcgKzI0MjU3LDcgQEAKIAkJCSJ2YWxpZGF0aW5nIGFnYWluc3QgYSBwYXR0ZXJuIGZhY2V0Iik7CiAJCSAgICByZXR1cm4gKC0xKTsKIAkJfSBlbHNlIHsKLQkJICAgIC8qIAorCQkgICAgLyoKIAkJICAgICogU2F2ZSB0aGUgbGFzdCBub24tdmFsaWRhdGluZyBmYWNldC4KIAkJICAgICovCiAJCSAgICBmYWNldCA9IGZhY2V0TGluay0+ZmFjZXQ7CkBAIC0yNDI3NiwxMiArMjQyODAsMTIgQEAKIAogICAgIHJldHVybiAoZXJyb3IpOwogfQotIAorCiBzdGF0aWMgeG1sQ2hhciAqCiB4bWxTY2hlbWFOb3JtYWxpemVWYWx1ZSh4bWxTY2hlbWFUeXBlUHRyIHR5cGUsCiAJCQljb25zdCB4bWxDaGFyICp2YWx1ZSkKIHsKLSAgICBzd2l0Y2ggKHhtbFNjaGVtYUdldFdoaXRlU3BhY2VGYWNldFZhbHVlKHR5cGUpKSB7CQorICAgIHN3aXRjaCAoeG1sU2NoZW1hR2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUodHlwZSkpIHsKIAljYXNlIFhNTF9TQ0hFTUFfV0hJVEVTUEFDRV9DT0xMQVBTRToKIAkgICAgcmV0dXJuICh4bWxTY2hlbWFDb2xsYXBzZVN0cmluZyh2YWx1ZSkpOwogCWNhc2UgWE1MX1NDSEVNQV9XSElURVNQQUNFX1JFUExBQ0U6CkBAIC0yNDMwMCw3ICsyNDMwNCw3IEBACiAgICAgaW50IHJldDsKICAgICBjb25zdCB4bWxDaGFyICpuc05hbWU7CiAgICAgeG1sQ2hhciAqbG9jYWwsICpwcmVmaXggPSBOVUxMOwotICAgIAorCiAgICAgcmV0ID0geG1sVmFsaWRhdGVRTmFtZSh2YWx1ZSwgMSk7CiAgICAgaWYgKHJldCAhPSAwKSB7CiAJaWYgKHJldCA9PSAtMSkgewpAQCAtMjQzMjMsNyArMjQzMjcsNyBAQAogICAgICogIC0gaXMgdGhlcmUgYSBkZWZhdWx0IG5hbWVzcGFjZT8KICAgICAqLwogICAgIG5zTmFtZSA9IHhtbFNjaGVtYUxvb2t1cE5hbWVzcGFjZSh2Y3R4dCwgcHJlZml4KTsKLSAgICAKKwogICAgIGlmIChwcmVmaXggIT0gTlVMTCkgewogCXhtbEZyZWUocHJlZml4KTsKIAkvKgpAQCAtMjQzODAsNyArMjQzODQsNyBAQAogCSAgICB2YWx1ZSA9IG5vcm1WYWx1ZTsgXAogCWlzTm9ybWFsaXplZCA9IDE7IFwKICAgICB9Ci0gICAgCisKICAgICBpZiAoKHJldFZhbCAhPSBOVUxMKSAmJiAoKnJldFZhbCAhPSBOVUxMKSkgewogCXhtbFNjaGVtYUZyZWVWYWx1ZSgqcmV0VmFsKTsKIAkqcmV0VmFsID0gTlVMTDsKQEAgLTI0Mzk1LDE0ICsyNDM5OSwxNCBAQAogICAgICovCiAgICAgLyoKICAgICAqIDIuMSBJZiBUaGUgZGVmaW5pdGlvbiBpcyBFTlRJVFkgb3IgaXMgdmFsaWRseSBkZXJpdmVkIGZyb20gRU5USVRZIGdpdmVuCi0gICAgKiB0aGUgZW1wdHkgc2V0LCBhcyBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNiksIHRoZW4KLSAgICAqIHRoZSBzdHJpbmcgbXVzdCBiZSBhILdkZWNsYXJlZCBlbnRpdHkgbmFtZbcuCisgICAgKiB0aGUgZW1wdHkgc2V0LCBhcyBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAo77+9My4xNC42KSwgdGhlbgorICAgICogdGhlIHN0cmluZyBtdXN0IGJlIGEg77+9ZGVjbGFyZWQgZW50aXR5IG5hbWXvv70uCiAgICAgKi8KICAgICAvKgogICAgICogMi4yIElmIFRoZSBkZWZpbml0aW9uIGlzIEVOVElUSUVTIG9yIGlzIHZhbGlkbHkgZGVyaXZlZCBmcm9tIEVOVElUSUVTCi0gICAgKiBnaXZlbiB0aGUgZW1wdHkgc2V0LCBhcyBkZWZpbmVkIGluIFR5cGUgRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAopzMuMTQuNiksCi0gICAgKiB0aGVuIGV2ZXJ5IHdoaXRlc3BhY2UtZGVsaW1pdGVkIHN1YnN0cmluZyBvZiB0aGUgc3RyaW5nIG11c3QgYmUgYSC3ZGVjbGFyZWQKLSAgICAqIGVudGl0eSBuYW1lty4KKyAgICAqIGdpdmVuIHRoZSBlbXB0eSBzZXQsIGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICjvv70zLjE0LjYpLAorICAgICogdGhlbiBldmVyeSB3aGl0ZXNwYWNlLWRlbGltaXRlZCBzdWJzdHJpbmcgb2YgdGhlIHN0cmluZyBtdXN0IGJlIGEg77+9ZGVjbGFyZWQKKyAgICAqIGVudGl0eSBuYW1l77+9LgogICAgICovCiAgICAgLyoKICAgICAqIDIuMyBvdGhlcndpc2Ugbm8gZnVydGhlciBjb25kaXRpb24gYXBwbGllcy4KQEAgLTI0NDE0LDggKzI0NDE4LDggQEAKICAgICBpZiAoV1hTX0lTX0FOWV9TSU1QTEVfVFlQRSh0eXBlKSB8fCBXWFNfSVNfQVRPTUlDKHR5cGUpKSB7CiAJeG1sU2NoZW1hVHlwZVB0ciBiaVR5cGU7IC8qIFRoZSBidWlsdC1pbiB0eXBlLiAqLwogCS8qCi0JKiBTUEVDICgxLjIuMSkgImlmIHt2YXJpZXR5fSBpcyC3YXRvbWljtyB0aGVuIHRoZSBzdHJpbmcgbXVzdCC3bWF0Y2i3Ci0JKiBhIGxpdGVyYWwgaW4gdGhlILdsZXhpY2FsIHNwYWNltyBvZiB7YmFzZSB0eXBlIGRlZmluaXRpb259IgorCSogU1BFQyAoMS4yLjEpICJpZiB7dmFyaWV0eX0gaXMg77+9YXRvbWlj77+9IHRoZW4gdGhlIHN0cmluZyBtdXN0IO+/vW1hdGNo77+9CisJKiBhIGxpdGVyYWwgaW4gdGhlIO+/vWxleGljYWwgc3BhY2Xvv70gb2Yge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSIKIAkqLwogCS8qCiAJKiBXaGl0ZXNwYWNlLW5vcm1hbGl6ZS4KQEAgLTI0NDQxLDkgKzI0NDQ1LDkgQEAKIAkqIE5PVEFUSU9OcyBuZWVkIHRvIGJlIHByb2Nlc3NlZCBoZXJlLCBzaW5jZSB0aGV5IG5lZWQKIAkqIHRvIGxvb2t1cCBpbiB0aGUgaGFzaHRhYmxlIG9mIE5PVEFUSU9OIGRlY2xhcmF0aW9ucyBvZiB0aGUgc2NoZW1hLgogCSovCi0JaWYgKGFjdHh0LT50eXBlID09IFhNTF9TQ0hFTUFfQ1RYVF9WQUxJREFUT1IpIHsJICAgIAotCSAgICBzd2l0Y2ggKGJpVHlwZS0+YnVpbHRJblR5cGUpIHsJCQotCQljYXNlIFhNTF9TQ0hFTUFTX05PVEFUSU9OOgkJICAgIAorCWlmIChhY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfVkFMSURBVE9SKSB7CisJICAgIHN3aXRjaCAoYmlUeXBlLT5idWlsdEluVHlwZSkgeworCQljYXNlIFhNTF9TQ0hFTUFTX05PVEFUSU9OOgogCQkgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVOb3RhdGlvbigKIAkJCSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIpIGFjdHh0LAogCQkJKCh4bWxTY2hlbWFWYWxpZEN0eHRQdHIpIGFjdHh0KS0+c2NoZW1hLApAQCAtMjQ0NjMsOCArMjQ0NjcsOCBAQAogCQkJICAgIHZhbHVlLCBOVUxMLCBOVUxMKTsKIAkJICAgIGJyZWFrOwogCSAgICB9Ci0JfSBlbHNlIGlmIChhY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfUEFSU0VSKSB7CSAgICAKLQkgICAgc3dpdGNoIChiaVR5cGUtPmJ1aWx0SW5UeXBlKSB7CQkgICAgCisJfSBlbHNlIGlmIChhY3R4dC0+dHlwZSA9PSBYTUxfU0NIRU1BX0NUWFRfUEFSU0VSKSB7CisJICAgIHN3aXRjaCAoYmlUeXBlLT5idWlsdEluVHlwZSkgewogCQljYXNlIFhNTF9TQ0hFTUFTX05PVEFUSU9OOgogCQkgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVOb3RhdGlvbihOVUxMLAogCQkJKCh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyKSBhY3R4dCktPnNjaGVtYSwgbm9kZSwKQEAgLTI0NDc5LDcgKzI0NDgzLDcgQEAKIAkJCXJldCA9IHhtbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtKGJpVHlwZSwKIAkJCSAgICB2YWx1ZSwgTlVMTCwgbm9kZSk7CiAJCSAgICBicmVhazsKLQkgICAgfQkgICAKKwkgICAgfQogCX0gZWxzZSB7CiAJICAgIC8qCiAJICAgICogVmFsaWRhdGlvbiB2aWEgYSBwdWJsaWMgQVBJIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCkBAIC0yNDQ5Niw3ICsyNDUwMCw3IEBACiAJICAgIGlmIChXWFNfSVNfTElTVCh0eXBlKSkKIAkJcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8yOwogCSAgICBlbHNlCi0JCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMTsJICAgIAorCQlyZXQgPSBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzE7CiAJfQogCWlmICgocmV0ID09IDApICYmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfSEFTX0ZBQ0VUUykpIHsKIAkgICAgLyoKQEAgLTI0NTExLDEwICsyNDUxNSwxMCBAQAogCQkJInZhbGlkYXRpbmcgZmFjZXRzIG9mIGF0b21pYyBzaW1wbGUgdHlwZSIpOwogCQkgICAgZ290byBpbnRlcm5hbF9lcnJvcjsKIAkJfQotCQlpZiAoV1hTX0lTX0xJU1QodHlwZSkpIAorCQlpZiAoV1hTX0lTX0xJU1QodHlwZSkpCiAJCSAgICByZXQgPSBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzI7CiAJCWVsc2UKLQkJICAgIHJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMTsJCQorCQkgICAgcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8xOwogCSAgICB9CiAJfQogCWlmIChmaXJlRXJyb3JzICYmIChyZXQgPiAwKSkKQEAgLTI0NTI2LDkgKzI0NTMwLDkgQEAKIAl4bWxDaGFyICp0bXBWYWx1ZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsZW4gPSAwOwogCXhtbFNjaGVtYVZhbFB0ciBwcmV2VmFsID0gTlVMTCwgY3VyVmFsID0gTlVMTDsKLQkvKiAxLjIuMiBpZiB7dmFyaWV0eX0gaXMgt2xpc3S3IHRoZW4gdGhlIHN0cmluZyBtdXN0IGJlIGEgc2VxdWVuY2UKLQkqIG9mIHdoaXRlIHNwYWNlIHNlcGFyYXRlZCB0b2tlbnMsIGVhY2ggb2Ygd2hpY2ggt21hdGNot2VzIGEgbGl0ZXJhbAotCSogaW4gdGhlILdsZXhpY2FsIHNwYWNltyBvZiB7aXRlbSB0eXBlIGRlZmluaXRpb259CisJLyogMS4yLjIgaWYge3ZhcmlldHl9IGlzIO+/vWxpc3Tvv70gdGhlbiB0aGUgc3RyaW5nIG11c3QgYmUgYSBzZXF1ZW5jZQorCSogb2Ygd2hpdGUgc3BhY2Ugc2VwYXJhdGVkIHRva2VucywgZWFjaCBvZiB3aGljaCDvv71tYXRjaO+/vWVzIGEgbGl0ZXJhbAorCSogaW4gdGhlIO+/vWxleGljYWwgc3BhY2Xvv70gb2Yge2l0ZW0gdHlwZSBkZWZpbml0aW9ufQogCSovCiAJLyoKIAkqIE5vdGUgdGhhdCBYTUxfU0NIRU1BU19UWVBFX05PUk1WQUxVRU5FRURFRCB3aWxsIGJlIHNldCBpZgpAQCAtMjQ1MzksNyArMjQ1NDMsNyBAQAogCSogVkFMIFRPRE86IE9wdGltaXplIHZhbGlkYXRpb24gb2YgZW1wdHkgdmFsdWVzLgogCSogVkFMIFRPRE86IFdlIGRvIG5vdCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBmb3IgbGlzdHMuCiAJKi8KLQlpdGVtVHlwZSA9IFdYU19MSVNUX0lURU1UWVBFKHR5cGUpOwkKKwlpdGVtVHlwZSA9IFdYU19MSVNUX0lURU1UWVBFKHR5cGUpOwogCWN1ciA9IHZhbHVlOwogCWRvIHsKIAkgICAgd2hpbGUgKElTX0JMQU5LX0NIKCpjdXIpKQpAQCAtMjQ1NzgsNyArMjQ1ODIsNyBAQAogCQl9CiAJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMjsKIAkJYnJlYWs7Ci0JICAgIH0JICAgIAorCSAgICB9CiAJICAgIGN1ciA9IGVuZDsKIAl9IHdoaWxlICgqY3VyICE9IDApOwogCUZSRUVfQU5EX05VTEwodG1wVmFsdWUpOwpAQCAtMjQ1OTksNyArMjQ2MDMsNyBAQAogCSAgICB9CiAJfQogCWlmIChmaXJlRXJyb3JzICYmIChyZXQgPiAwKSkgewotCSAgICAvKiAKKwkgICAgLyoKIAkgICAgKiBSZXBvcnQgdGhlIG5vcm1hbGl6ZWQgdmFsdWUuCiAJICAgICovCiAJICAgIG5vcm1hbGl6ZSA9IDE7CkBAIC0yNDYwOSwxMCArMjQ2MTMsMTAgQEAKICAgICB9IGVsc2UgaWYgKFdYU19JU19VTklPTih0eXBlKSkgewogCXhtbFNjaGVtYVR5cGVMaW5rUHRyIG1lbWJlckxpbms7CiAJLyoKLQkqIFRPRE86IEZvciBhbGwgZGF0YXR5cGVzILdkZXJpdmVktyBieSC3dW5pb263ICB3aGl0ZVNwYWNlIGRvZXMKLQkqIG5vdCBhcHBseSBkaXJlY3RseTsgaG93ZXZlciwgdGhlIG5vcm1hbGl6YXRpb24gYmVoYXZpb3Igb2Ygt3VuaW9utworCSogVE9ETzogRm9yIGFsbCBkYXRhdHlwZXMg77+9ZGVyaXZlZO+/vSBieSDvv711bmlvbu+/vSAgd2hpdGVTcGFjZSBkb2VzCisJKiBub3QgYXBwbHkgZGlyZWN0bHk7IGhvd2V2ZXIsIHRoZSBub3JtYWxpemF0aW9uIGJlaGF2aW9yIG9mIO+/vXVuaW9u77+9CiAJKiB0eXBlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSB2YWx1ZSBvZiB3aGl0ZVNwYWNlIG9uIHRoYXQgb25lIG9mIHRoZQotCSogt21lbWJlclR5cGVztyBhZ2FpbnN0IHdoaWNoIHRoZSC3dW5pb263IGlzIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQuCisJKiDvv71tZW1iZXJUeXBlc++/vSBhZ2FpbnN0IHdoaWNoIHRoZSDvv711bmlvbu+/vSBpcyBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkLgogCSoKIAkqIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgbm9ybWFsaXplZCBieSB0aGUgZmlyc3QgdmFsaWRhdGluZwogCSogbWVtYmVyIHR5cGUsIHRoZW4gdGhlIGZhY2V0cyBvZiB0aGUgdW5pb24gdHlwZSBhcmUgYXBwbGllZC4gVGhpcwpAQCAtMjQ2MjAsOCArMjQ2MjQsOCBAQAogCSovCiAKIAkvKgotCSogMS4yLjMgaWYge3ZhcmlldHl9IGlzILd1bmlvbrcgdGhlbiB0aGUgc3RyaW5nIG11c3Qgt21hdGNotyBhCi0JKiBsaXRlcmFsIGluIHRoZSC3bGV4aWNhbCBzcGFjZbcgb2YgYXQgbGVhc3Qgb25lIG1lbWJlciBvZgorCSogMS4yLjMgaWYge3ZhcmlldHl9IGlzIO+/vXVuaW9u77+9IHRoZW4gdGhlIHN0cmluZyBtdXN0IO+/vW1hdGNo77+9IGEKKwkqIGxpdGVyYWwgaW4gdGhlIO+/vWxleGljYWwgc3BhY2Xvv70gb2YgYXQgbGVhc3Qgb25lIG1lbWJlciBvZgogCSoge21lbWJlciB0eXBlIGRlZmluaXRpb25zfQogCSovCiAJbWVtYmVyTGluayA9IHhtbFNjaGVtYUdldFVuaW9uU2ltcGxlVHlwZU1lbWJlclR5cGVzKHR5cGUpOwpAQCAtMjQ2MjksNyArMjQ2MzMsNyBAQAogCSAgICBBRVJST1JfSU5UKCJ4bWxTY2hlbWFWQ2hlY2tDVkNTaW1wbGVUeXBlIiwKIAkJInVuaW9uIHNpbXBsZSB0eXBlIGhhcyBubyBtZW1iZXIgdHlwZXMiKTsKIAkgICAgZ290byBpbnRlcm5hbF9lcnJvcjsKLQl9CQorCX0KIAkvKgogCSogQWx3YXlzIG5vcm1hbGl6ZSB1bmlvbiB0eXBlIHZhbHVlcywgc2luY2Ugd2UgY3VycmVudGx5CiAJKiBjYW5ub3Qgc3RvcmUgdGhlIHdoaXRlc3BhY2UgaW5mb3JtYXRpb24gd2l0aCB0aGUgdmFsdWUKQEAgLTI0NjM3LDcgKzI0NjQxLDcgQEAKIAkqIG5vdCBwb3NzaWJsZS4KIAkqLwogCXdoaWxlIChtZW1iZXJMaW5rICE9IE5VTEwpIHsKLQkgICAgaWYgKHZhbE5lZWRlZCkgCisJICAgIGlmICh2YWxOZWVkZWQpCiAJCXJldCA9IHhtbFNjaGVtYVZDaGVja0NWQ1NpbXBsZVR5cGUoYWN0eHQsIG5vZGUsCiAJCSAgICBtZW1iZXJMaW5rLT50eXBlLCB2YWx1ZSwgJnZhbCwgMCwgMSwgMCk7CiAJICAgIGVsc2UKQEAgLTI0NjYwLDkgKzI0NjY0LDkgQEAKIAkqLwogCWlmICgocmV0ID09IDApICYmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfSEFTX0ZBQ0VUUykpIHsKIAkgICAgLyoKLQkgICAgKiBUaGUgbm9ybWFsaXphdGlvbiBiZWhhdmlvciBvZiC3dW5pb263IHR5cGVzIGlzIGNvbnRyb2xsZWQgYnkKLQkgICAgKiB0aGUgdmFsdWUgb2Ygd2hpdGVTcGFjZSBvbiB0aGF0IG9uZSBvZiB0aGUgt21lbWJlclR5cGVztwotCSAgICAqIGFnYWluc3Qgd2hpY2ggdGhlILd1bmlvbrcgaXMgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZC4KKwkgICAgKiBUaGUgbm9ybWFsaXphdGlvbiBiZWhhdmlvciBvZiDvv711bmlvbu+/vSB0eXBlcyBpcyBjb250cm9sbGVkIGJ5CisJICAgICogdGhlIHZhbHVlIG9mIHdoaXRlU3BhY2Ugb24gdGhhdCBvbmUgb2YgdGhlIO+/vW1lbWJlclR5cGVz77+9CisJICAgICogYWdhaW5zdCB3aGljaCB0aGUg77+9dW5pb27vv70gaXMgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZC4KIAkgICAgKi8KIAkgICAgTk9STUFMSVpFKG1lbWJlckxpbmstPnR5cGUpOwogCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0cyhhY3R4dCwgbm9kZSwgdHlwZSwKQEAgLTI0Njc0LDcgKzI0Njc4LDcgQEAKIAkJCSJ2YWxpZGF0aW5nIGZhY2V0cyBvZiB1bmlvbiBzaW1wbGUgdHlwZSIpOwogCQkgICAgZ290byBpbnRlcm5hbF9lcnJvcjsKIAkJfQotCQlyZXQgPSBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzM7CQkKKwkJcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8zOwogCSAgICB9CiAJfQogCWlmIChmaXJlRXJyb3JzICYmIChyZXQgPiAwKSkKQEAgLTI0ODIyLDE0ICsyNDgyNiwxNCBAQAogCiAJICAgIC8qCiAJICAgICogU1BFQyBjdmMtZWx0ICgzLjMuNCkgOiAoNC4zKSAoVHlwZSBEZXJpdmF0aW9uIE9LKQotCSAgICAqICJUaGUgt2xvY2FsIHR5cGUgZGVmaW5pdGlvbrcgbXVzdCBiZSB2YWxpZGx5CisJICAgICogIlRoZSDvv71sb2NhbCB0eXBlIGRlZmluaXRpb27vv70gbXVzdCBiZSB2YWxpZGx5CiAJICAgICogZGVyaXZlZCBmcm9tIHRoZSB7dHlwZSBkZWZpbml0aW9ufSBnaXZlbiB0aGUgdW5pb24gb2YKIAkgICAgKiB0aGUge2Rpc2FsbG93ZWQgc3Vic3RpdHV0aW9uc30gYW5kIHRoZSB7dHlwZSBkZWZpbml0aW9ufSdzCiAJICAgICoge3Byb2hpYml0ZWQgc3Vic3RpdHV0aW9uc30sIGFzIGRlZmluZWQgaW4KLQkgICAgKiBUeXBlIERlcml2YXRpb24gT0sgKENvbXBsZXgpICinMy40LjYpCisJICAgICogVHlwZSBEZXJpdmF0aW9uIE9LIChDb21wbGV4KSAo77+9My40LjYpCiAJICAgICogKGlmIGl0IGlzIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24pLAogCSAgICAqIG9yIGdpdmVuIHtkaXNhbGxvd2VkIHN1YnN0aXR1dGlvbnN9IGFzIGRlZmluZWQgaW4gVHlwZQotCSAgICAqIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpIChpZiBpdCBpcyBhIHNpbXBsZSB0eXBlCisJICAgICogRGVyaXZhdGlvbiBPSyAoU2ltcGxlKSAo77+9My4xNC42KSAoaWYgaXQgaXMgYSBzaW1wbGUgdHlwZQogCSAgICAqIGRlZmluaXRpb24pLiIKIAkgICAgKgogCSAgICAqIHtkaXNhbGxvd2VkIHN1YnN0aXR1dGlvbnN9OiB0aGUgImJsb2NrIiBvbiB0aGUgZWxlbWVudCBkZWNsLgpAQCAtMjUwODksMTkgKzI1MDkzLDE5IEBACiBzdGF0aWMgaW50CiB4bWxTY2hlbWFWQXR0cmlidXRlc0NvbXBsZXgoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZjdHh0KQogewotICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSA9IHZjdHh0LT5pbm9kZS0+dHlwZURlZjsgICAgCisgICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlID0gdmN0eHQtPmlub2RlLT50eXBlRGVmOwogICAgIHhtbFNjaGVtYUl0ZW1MaXN0UHRyIGF0dHJVc2VMaXN0OwogICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVVzZVB0ciBhdHRyVXNlID0gTlVMTDsKICAgICB4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgYXR0ckRlY2wgPSBOVUxMOwotICAgIHhtbFNjaGVtYUF0dHJJbmZvUHRyIGlhdHRyLCB0bXBpYXR0cjsgICAgCisgICAgeG1sU2NoZW1hQXR0ckluZm9QdHIgaWF0dHIsIHRtcGlhdHRyOwogICAgIGludCBpLCBqLCBmb3VuZCwgbmJBdHRycywgbmJVc2VzOwogICAgIGludCB4cGF0aFJlcyA9IDAsIHJlcywgd2lsZElEcyA9IDAsIGZpeGVkOwogICAgIHhtbE5vZGVQdHIgZGVmQXR0ck93bmVyRWxlbSA9IE5VTEw7CiAKICAgICAvKgogICAgICogU1BFQyAoY3ZjLWF0dHJpYnV0ZSkKLSAgICAqICgxKSAiVGhlIGRlY2xhcmF0aW9uIG11c3Qgbm90IGJlILdhYnNlbnS3IChzZWUgTWlzc2luZwotICAgICogU3ViLWNvbXBvbmVudHMgKKc1LjMpIGZvciBob3cgdGhpcyBjYW4gZmFpbCB0byBiZQorICAgICogKDEpICJUaGUgZGVjbGFyYXRpb24gbXVzdCBub3QgYmUg77+9YWJzZW5077+9IChzZWUgTWlzc2luZworICAgICogU3ViLWNvbXBvbmVudHMgKO+/vTUuMykgZm9yIGhvdyB0aGlzIGNhbiBmYWlsIHRvIGJlCiAgICAgKiB0aGUgY2FzZSkuIgogICAgICogKDIpICJJdHMge3R5cGUgZGVmaW5pdGlvbn0gbXVzdCBub3QgYmUgYWJzZW50LiIKICAgICAqCkBAIC0yNTE1MSwxNSArMjUxNTUsMTUgQEAKIAkgICAgKiB1c2Ugd2l0aCBhbiB7YXR0cmlidXRlIGRlY2xhcmF0aW9ufSB3aG9zZSB7bmFtZX0gbWF0Y2hlcwogCSAgICAqIHRoZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gaXRlbSdzIFtsb2NhbCBuYW1lXSBhbmQgd2hvc2UKIAkgICAgKiB7dGFyZ2V0IG5hbWVzcGFjZX0gaXMgaWRlbnRpY2FsIHRvIHRoZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24KLQkgICAgKiBpdGVtJ3MgW25hbWVzcGFjZSBuYW1lXSAod2hlcmUgYW4gt2Fic2VudLcge3RhcmdldCBuYW1lc3BhY2V9CisJICAgICogaXRlbSdzIFtuYW1lc3BhY2UgbmFtZV0gKHdoZXJlIGFuIO+/vWFic2VudO+/vSB7dGFyZ2V0IG5hbWVzcGFjZX0KIAkgICAgKiBpcyB0YWtlbiB0byBiZSBpZGVudGljYWwgdG8gYSBbbmFtZXNwYWNlIG5hbWVdIHdpdGggbm8gdmFsdWUpLAotCSAgICAqIHRoZW4gdGhlIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBtdXN0IGJlILd2YWxpZLcgd2l0aCByZXNwZWN0CisJICAgICogdGhlbiB0aGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIG11c3QgYmUg77+9dmFsaWTvv70gd2l0aCByZXNwZWN0CiAJICAgICogdG8gdGhhdCBhdHRyaWJ1dGUgdXNlIGFzIHBlciBBdHRyaWJ1dGUgTG9jYWxseSBWYWxpZCAoVXNlKQotCSAgICAqICinMy41LjQpLiBJbiB0aGlzIGNhc2UgdGhlIHthdHRyaWJ1dGUgZGVjbGFyYXRpb259IG9mIHRoYXQKLQkgICAgKiBhdHRyaWJ1dGUgdXNlIGlzIHRoZSC3Y29udGV4dC1kZXRlcm1pbmVkIGRlY2xhcmF0aW9utyBmb3IgdGhlCisJICAgICogKO+/vTMuNS40KS4gSW4gdGhpcyBjYXNlIHRoZSB7YXR0cmlidXRlIGRlY2xhcmF0aW9ufSBvZiB0aGF0CisJICAgICogYXR0cmlidXRlIHVzZSBpcyB0aGUg77+9Y29udGV4dC1kZXRlcm1pbmVkIGRlY2xhcmF0aW9u77+9IGZvciB0aGUKIAkgICAgKiBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gaXRlbSB3aXRoIHJlc3BlY3QgdG8gU2NoZW1hLVZhbGlkaXR5Ci0JICAgICogQXNzZXNzbWVudCAoQXR0cmlidXRlKSAopzMuMi40KSBhbmQKLQkgICAgKiBBc3Nlc3NtZW50IE91dGNvbWUgKEF0dHJpYnV0ZSkgKKczLjIuNSkuCisJICAgICogQXNzZXNzbWVudCAoQXR0cmlidXRlKSAo77+9My4yLjQpIGFuZAorCSAgICAqIEFzc2Vzc21lbnQgT3V0Y29tZSAoQXR0cmlidXRlKSAo77+9My4yLjUpLgogCSAgICAqLwogCSAgICBpYXR0ci0+c3RhdGUgPSBYTUxfU0NIRU1BU19BVFRSX0FTU0VTU0VEOwogCSAgICBpYXR0ci0+dXNlID0gYXR0clVzZTsKQEAgLTI1MTkzLDcgKzI1MTk3LDcgQEAKIAkgICAgfQogCSAgICB0bXBpYXR0ci0+c3RhdGUgPSBYTUxfU0NIRU1BU19BVFRSX0VSUl9NSVNTSU5HOwogCSAgICB0bXBpYXR0ci0+dXNlID0gYXR0clVzZTsKLQkgICAgdG1waWF0dHItPmRlY2wgPSBhdHRyRGVjbDsJICAgIAorCSAgICB0bXBpYXR0ci0+ZGVjbCA9IGF0dHJEZWNsOwogCX0gZWxzZSBpZiAoKGF0dHJVc2UtPm9jY3VycyA9PSBYTUxfU0NIRU1BU19BVFRSX1VTRV9PUFRJT05BTCkgJiYKIAkgICAgKChhdHRyVXNlLT5kZWZWYWx1ZSAhPSBOVUxMKSB8fAogCSAgICAgKGF0dHJEZWNsLT5kZWZWYWx1ZSAhPSBOVUxMKSkpIHsKQEAgLTI1MjM3LDEzICsyNTI0MSwxMyBAQAogCQljb250aW51ZTsKIAkgICAgLyoKIAkgICAgKiBTUEVDIChjdmMtY29tcGxleC10eXBlKQotCSAgICAqICgzLjIuMikgIlRoZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGJlILd2YWxpZLcgd2l0aAotCSAgICAqIHJlc3BlY3QgdG8gaXQgYXMgZGVmaW5lZCBpbiBJdGVtIFZhbGlkIChXaWxkY2FyZCkgKKczLjEwLjQpLiIKKwkgICAgKiAoMy4yLjIpICJUaGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIGl0ZW0gbXVzdCBiZSDvv712YWxpZO+/vSB3aXRoCisJICAgICogcmVzcGVjdCB0byBpdCBhcyBkZWZpbmVkIGluIEl0ZW0gVmFsaWQgKFdpbGRjYXJkKSAo77+9My4xMC40KS4iCiAJICAgICoKIAkgICAgKiBTUEVDIEl0ZW0gVmFsaWQgKFdpbGRjYXJkKSAoY3ZjLXdpbGRjYXJkKQotCSAgICAqICIuLi4gaXRzIFtuYW1lc3BhY2UgbmFtZV0gbXVzdCBiZSC3dmFsaWS3IHdpdGggcmVzcGVjdCB0bworCSAgICAqICIuLi4gaXRzIFtuYW1lc3BhY2UgbmFtZV0gbXVzdCBiZSDvv712YWxpZO+/vSB3aXRoIHJlc3BlY3QgdG8KIAkgICAgKiB0aGUgd2lsZGNhcmQgY29uc3RyYWludCwgYXMgZGVmaW5lZCBpbiBXaWxkY2FyZCBhbGxvd3MKLQkgICAgKiBOYW1lc3BhY2UgTmFtZSAopzMuMTAuNCkuIgorCSAgICAqIE5hbWVzcGFjZSBOYW1lICjvv70zLjEwLjQpLiIKIAkgICAgKi8KIAkgICAgaWYgKHhtbFNjaGVtYUNoZWNrQ1ZDV2lsZGNhcmROYW1lc3BhY2UodHlwZS0+YXR0cmlidXRlV2lsZGNhcmQsCiAJCSAgICBpYXR0ci0+bnNOYW1lKSA9PSAwKSB7CkBAIC0yNTI3OSwxMSArMjUyODMsMTEgQEAKIAkJICAgICogU1BFQyAoY3ZjLWNvbXBsZXgtdHlwZSkKIAkJICAgICogKDUpICJMZXQgW0RlZmluaXRpb246XSAgdGhlIHdpbGQgSURzIGJlIHRoZSBzZXQgb2YKIAkJICAgICogYWxsIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBpdGVtIHRvIHdoaWNoIGNsYXVzZSAzLjIKLQkJICAgICogYXBwbGllZCBhbmQgd2hvc2Ugt3ZhbGlkYXRpb263IHJlc3VsdGVkIGluIGEKLQkJICAgICogt2NvbnRleHQtZGV0ZXJtaW5lZCBkZWNsYXJhdGlvbrcgb2YgbXVzdEZpbmQgb3Igbm8KLQkJICAgICogt2NvbnRleHQtZGV0ZXJtaW5lZCBkZWNsYXJhdGlvbrcgYXQgYWxsLCBhbmQgd2hvc2UKKwkJICAgICogYXBwbGllZCBhbmQgd2hvc2Ug77+9dmFsaWRhdGlvbu+/vSByZXN1bHRlZCBpbiBhCisJCSAgICAqIO+/vWNvbnRleHQtZGV0ZXJtaW5lZCBkZWNsYXJhdGlvbu+/vSBvZiBtdXN0RmluZCBvciBubworCQkgICAgKiDvv71jb250ZXh0LWRldGVybWluZWQgZGVjbGFyYXRpb27vv70gYXQgYWxsLCBhbmQgd2hvc2UKIAkJICAgICogW2xvY2FsIG5hbWVdIGFuZCBbbmFtZXNwYWNlIG5hbWVdIHJlc29sdmUgKGFzCi0JCSAgICAqIGRlZmluZWQgYnkgUU5hbWUgcmVzb2x1dGlvbiAoSW5zdGFuY2UpICinMy4xNS40KSkgdG8KKwkJICAgICogZGVmaW5lZCBieSBRTmFtZSByZXNvbHV0aW9uIChJbnN0YW5jZSkgKO+/vTMuMTUuNCkpIHRvCiAJCSAgICAqIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiB3aG9zZSB7dHlwZSBkZWZpbml0aW9ufSBpcwogCQkgICAgKiBvciBpcyBkZXJpdmVkIGZyb20gSUQuIFRoZW4gYWxsIG9mIHRoZSBmb2xsb3dpbmcKIAkJICAgICogbXVzdCBiZSB0cnVlOiIKQEAgLTI1MjkzLDcgKzI1Mjk3LDcgQEAKIAkJCWlhdHRyLT50eXBlRGVmLCBYTUxfU0NIRU1BU19JRCkpIHsKIAkJCS8qCiAJCQkqIFNQRUMgKDUuMSkgIlRoZXJlIG11c3QgYmUgbm8gbW9yZSB0aGFuIG9uZQotCQkJKiBpdGVtIGluILd3aWxkIElEc7cuIgorCQkJKiBpdGVtIGluIO+/vXdpbGQgSURz77+9LiIKIAkJCSovCiAJCQlpZiAod2lsZElEcyAhPSAwKSB7CiAJCQkgICAgLyogVkFMIFRPRE8gKi8KQEAgLTI1MzA0LDcgKzI1MzA4LDcgQEAKIAkJCXdpbGRJRHMrKzsKIAkJCS8qCiAJCQkqIFNQRUMgKGN2Yy1jb21wbGV4LXR5cGUpCi0JCQkqICg1LjIpICJJZiC3d2lsZCBJRHO3IGlzIG5vbi1lbXB0eSwgdGhlcmUgbXVzdCBub3QKKwkJCSogKDUuMikgIklmIO+/vXdpbGQgSURz77+9IGlzIG5vbi1lbXB0eSwgdGhlcmUgbXVzdCBub3QKIAkJCSogYmUgYW55IGF0dHJpYnV0ZSB1c2VzIGFtb25nIHRoZSB7YXR0cmlidXRlIHVzZXN9CiAJCQkqIHdob3NlIHthdHRyaWJ1dGUgZGVjbGFyYXRpb259J3Mge3R5cGUgZGVmaW5pdGlvbn0KIAkJCSogaXMgb3IgaXMgZGVyaXZlZCBmcm9tIElELiIKQEAgLTI1NDIxLDcgKzI1NDI1LDcgQEAKIAkgICAgKiBWQUwgVE9ETzogU2hvdWxkIHdlIHVzZSB0aGUgKm5vcm1hbGl6ZWQqIHZhbHVlPyBUaGlzIGN1cnJlbnRseQogCSAgICAqICAgdXNlcyB0aGUgKmluaXRpYWwqIHZhbHVlLgogCSAgICAqLwotCSAgICAKKwogCSAgICBpZiAoZGVmQXR0ck93bmVyRWxlbSkgewogCQl4bWxDaGFyICpub3JtVmFsdWU7CiAJCWNvbnN0IHhtbENoYXIgKnZhbHVlOwpAQCAtMjU1MTIsOSArMjU1MTYsOSBAQAogCSAgICBmaXhlZCA9IDA7CiAJLyoKIAkqIFNQRUMgKGN2Yy1hdHRyaWJ1dGUpCi0JKiAoMykgIlRoZSBpdGVtJ3Mgt25vcm1hbGl6ZWQgdmFsdWW3IG11c3QgYmUgbG9jYWxseSC3dmFsaWS3Ci0JKiB3aXRoIHJlc3BlY3QgdG8gdGhhdCB7dHlwZSBkZWZpbml0aW9ufSBhcyBwZXIgCi0JKiBTdHJpbmcgVmFsaWQgKKczLjE0LjQpLiIKKwkqICgzKSAiVGhlIGl0ZW0ncyDvv71ub3JtYWxpemVkIHZhbHVl77+9IG11c3QgYmUgbG9jYWxseSDvv712YWxpZO+/vQorCSogd2l0aCByZXNwZWN0IHRvIHRoYXQge3R5cGUgZGVmaW5pdGlvbn0gYXMgcGVyCisJKiBTdHJpbmcgVmFsaWQgKO+/vTMuMTQuNCkuIgogCSoKIAkqIFZBTCBUT0RPOiBEbyB3ZSBhbHJlYWR5IGhhdmUgdGhlCiAJKiAibm9ybWFsaXplZCBhdHRyaWJ1dGUgdmFsdWUiIGhlcmU/CkBAIC0yNTUzNCw3ICsyNTUzOCw3IEBACiAJCWlhdHRyLT5ub2RlLCBpYXR0ci0+dHlwZURlZiwgaWF0dHItPnZhbHVlLCBOVUxMLAogCQkxLCAwLCAwKTsKIAl9Ci0JICAgIAorCiAJaWYgKHJlcyAhPSAwKSB7CiAJICAgIGlmIChyZXMgPT0gLTEpIHsKIAkJVkVSUk9SX0lOVCgieG1sU2NoZW1hVkF0dHJpYnV0ZXNDb21wbGV4IiwKQEAgLTI1NTQ5LDEyICsyNTU1MywxMiBAQAogCSAgICBnb3RvIGV2YWxfaWRjczsKIAl9CiAKLQlpZiAoZml4ZWQpIHsJICAgIAorCWlmIChmaXhlZCkgewogCSAgICAvKgogCSAgICAqIFNQRUMgQXR0cmlidXRlIExvY2FsbHkgVmFsaWQgKFVzZSkgKGN2Yy1hdSkKLQkgICAgKiAiRm9yIGFuIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBpdGVtIHRvIGJlt3ZhbGlktworCSAgICAqICJGb3IgYW4gYXR0cmlidXRlIGluZm9ybWF0aW9uIGl0ZW0gdG8gYmXvv712YWxpZO+/vQogCSAgICAqIHdpdGggcmVzcGVjdCB0byBhbiBhdHRyaWJ1dGUgdXNlIGl0cyAqbm9ybWFsaXplZCoKLQkgICAgKiB2YWx1ZbcgbXVzdCBtYXRjaCB0aGUgKmNhbm9uaWNhbCogbGV4aWNhbAorCSAgICAqIHZhbHVl77+9IG11c3QgbWF0Y2ggdGhlICpjYW5vbmljYWwqIGxleGljYWwKIAkgICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXR0cmlidXRlIHVzZSdzIHt2YWx1ZQogCSAgICAqIGNvbnN0cmFpbnR9dmFsdWUsIGlmIGl0IGlzIHByZXNlbnQgYW5kIGZpeGVkLiIKIAkgICAgKgpAQCAtMjU1NjMsNyArMjU1NjcsNyBAQAogCSAgICAqLwogCSAgICAvKgogCSAgICAqIFNQRUMgQXR0cmlidXRlIExvY2FsbHkgVmFsaWQgKGN2Yy1hdHRyaWJ1dGUpCi0JICAgICogKDQpICJUaGUgaXRlbSdzICphY3R1YWwqIHZhbHVltyBtdXN0IG1hdGNoIHRoZSAqdmFsdWUqIG9mCisJICAgICogKDQpICJUaGUgaXRlbSdzICphY3R1YWwqIHZhbHVl77+9IG11c3QgbWF0Y2ggdGhlICp2YWx1ZSogb2YKIAkgICAgKiB0aGUge3ZhbHVlIGNvbnN0cmFpbnR9LCBpZiBpdCBpcyBwcmVzZW50IGFuZCBmaXhlZC4iCiAJICAgICovCiAJICAgIGlmIChpYXR0ci0+dmFsID09IE5VTEwpIHsKQEAgLTI1NjU1LDggKzI1NjU5LDggQEAKIAkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgdmN0eHQsCiAJCSAgICBYTUxfU0NIRU1BVl9DVkNfQVUsIE5VTEwsIE5VTEwsCiAJCSAgICAiVGhlIHZhbHVlICclcycgZG9lcyBub3QgbWF0Y2ggdGhlIGZpeGVkICIKLQkJICAgICJ2YWx1ZSBjb25zdHJhaW50ICclcyciLCAKLQkJICAgIGlhdHRyLT52YWx1ZSwgaWF0dHItPnZjVmFsdWUpOwkJCisJCSAgICAidmFsdWUgY29uc3RyYWludCAnJXMnIiwKKwkJICAgIGlhdHRyLT52YWx1ZSwgaWF0dHItPnZjVmFsdWUpOwogCQlicmVhazsKIAkgICAgY2FzZSBYTUxfU0NIRU1BU19BVFRSX0VSUl9XSUxEX1NUUklDVF9OT19ERUNMOgogCQlWRVJST1IoWE1MX1NDSEVNQVZfQ1ZDX1dJTERDQVJELCBOVUxMLApAQCAtMjU3MTgsNyArMjU3MjIsNyBAQAogCXhtbFNjaGVtYUVsZW1lbnRQdHIgZGVjbCA9IE5VTEw7CiAKIAlkZWNsID0geG1sU2NoZW1hR2V0RWxlbSh2Y3R4dC0+c2NoZW1hLAotCSAgICB2Y3R4dC0+aW5vZGUtPmxvY2FsTmFtZSwgdmN0eHQtPmlub2RlLT5uc05hbWUpOwkgICAgCisJICAgIHZjdHh0LT5pbm9kZS0+bG9jYWxOYW1lLCB2Y3R4dC0+aW5vZGUtPm5zTmFtZSk7CiAJaWYgKGRlY2wgIT0gTlVMTCkgewogCSAgICB2Y3R4dC0+aW5vZGUtPmRlY2wgPSBkZWNsOwogCSAgICByZXR1cm4gKDApOwpAQCAtMjU3NzYsMTYgKzI1NzgwLDE2IEBACiB4bWxTY2hlbWFDaGVja0NPU1ZhbGlkRGVmYXVsdCh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgdmN0eHQsCiAJCQkgICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZSwKIAkJCSAgICAgIHhtbFNjaGVtYVZhbFB0ciAqdmFsKQoteyAgIAorewogICAgIGludCByZXQgPSAwOwogICAgIHhtbFNjaGVtYU5vZGVJbmZvUHRyIGlub2RlID0gdmN0eHQtPmlub2RlOwogCiAgICAgLyoKICAgICAqIGNvcy12YWxpZC1kZWZhdWx0OgogICAgICogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFbGVtZW50IERlZmF1bHQgVmFsaWQgKEltbWVkaWF0ZSkKLSAgICAqIEZvciBhIHN0cmluZyB0byBiZSBhIHZhbGlkIGRlZmF1bHQgd2l0aCByZXNwZWN0IHRvIGEgdHlwZSAKKyAgICAqIEZvciBhIHN0cmluZyB0byBiZSBhIHZhbGlkIGRlZmF1bHQgd2l0aCByZXNwZWN0IHRvIGEgdHlwZQogICAgICogZGVmaW5pdGlvbiB0aGUgYXBwcm9wcmlhdGUgY2FzZSBhbW9uZyB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAqLyAgICAKKyAgICAqLwogICAgIGlmIFdYU19JU19DT01QTEVYKGlub2RlLT50eXBlRGVmKSB7CiAJLyoKIAkqIENvbXBsZXggdHlwZS4KQEAgLTI1NzkzLDggKzI1Nzk3LDggQEAKIAkqIFNQRUMgKDIuMSkgIml0cyB7Y29udGVudCB0eXBlfSBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbgogCSogb3IgbWl4ZWQuIgogCSogU1BFQyAoMi4yLjIpICJJZiB0aGUge2NvbnRlbnQgdHlwZX0gaXMgbWl4ZWQsIHRoZW4gdGhlIHtjb250ZW50Ci0JKiB0eXBlfSdzIHBhcnRpY2xlIG11c3QgYmUgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBieSAKLQkqIFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4iCisJKiB0eXBlfSdzIHBhcnRpY2xlIG11c3QgYmUg77+9ZW1wdGlhYmxl77+9IGFzIGRlZmluZWQgYnkKKwkqIFBhcnRpY2xlIEVtcHRpYWJsZSAo77+9My45LjYpLiIKIAkqLwogCWlmICgoISBXWFNfSEFTX1NJTVBMRV9DT05URU5UKGlub2RlLT50eXBlRGVmKSkgJiYKIAkgICAgKCghIFdYU19IQVNfTUlYRURfQ09OVEVOVChpbm9kZS0+dHlwZURlZikpIHx8CkBAIC0yNTgwNywxOCArMjU4MTEsMTggQEAKIAkJIm9yIG1peGVkIGNvbnRlbnQgYW5kIGEgcGFydGljbGUgZW1wdGlhYmxlIik7CiAJICAgIHJldHVybihyZXQpOwogCX0KLSAgICB9CQorICAgIH0KICAgICAvKgotICAgICogMSBJZiB0aGUgdHlwZSBkZWZpbml0aW9uIGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiB0aGUgc3RyaW5nIAotICAgICogbXVzdCBiZSC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGF0IGRlZmluaXRpb24gYXMgZGVmaW5lZCBieSBTdHJpbmcgCi0gICAgKiBWYWxpZCAopzMuMTQuNCkuCisgICAgKiAxIElmIHRoZSB0eXBlIGRlZmluaXRpb24gaXMgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIHRoZSBzdHJpbmcKKyAgICAqIG11c3QgYmUg77+9dmFsaWTvv70gd2l0aCByZXNwZWN0IHRvIHRoYXQgZGVmaW5pdGlvbiBhcyBkZWZpbmVkIGJ5IFN0cmluZworICAgICogVmFsaWQgKO+/vTMuMTQuNCkuCiAgICAgKgogICAgICogQU5ECiAgICAgKgotICAgICogMi4yLjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiB0aGUgCi0gICAgKiBzdHJpbmcgbXVzdCBiZSC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGF0IHNpbXBsZSB0eXBlIGRlZmluaXRpb24gCi0gICAgKiBhcyBkZWZpbmVkIGJ5IFN0cmluZyBWYWxpZCAopzMuMTQuNCkuCi0gICAgKi8gIAorICAgICogMi4yLjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiB0aGUKKyAgICAqIHN0cmluZyBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdCB0byB0aGF0IHNpbXBsZSB0eXBlIGRlZmluaXRpb24KKyAgICAqIGFzIGRlZmluZWQgYnkgU3RyaW5nIFZhbGlkICjvv70zLjE0LjQpLgorICAgICovCiAgICAgaWYgKFdYU19JU19TSU1QTEUoaW5vZGUtPnR5cGVEZWYpKSB7CiAKIAlyZXQgPSB4bWxTY2hlbWFWQ2hlY2tDVkNTaW1wbGVUeXBlKEFDVFhUX0NBU1QgdmN0eHQsCkBAIC0yNTgzMiw3ICsyNTgzNiw3IEBACiAgICAgaWYgKHJldCA8IDApIHsKIAlWRVJST1JfSU5UKCJ4bWxTY2hlbWFDaGVja0NPU1ZhbGlkRGVmYXVsdCIsCiAJICAgICJjYWxsaW5nIHhtbFNjaGVtYVZDaGVja0NWQ1NpbXBsZVR5cGUoKSIpOwotICAgIH0gICAgCisgICAgfQogICAgIHJldHVybiAocmV0KTsKIH0KIApAQCAtMjU4NjYsMTMgKzI1ODcwLDEzIEBACiAKIHN0YXRpYyBpbnQKIHhtbFNjaGVtYVZhbGlkYXRvclB1c2hFbGVtKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCkKLXsgICAgCit7CiAgICAgdmN0eHQtPmlub2RlID0geG1sU2NoZW1hR2V0RnJlc2hFbGVtSW5mbyh2Y3R4dCk7CiAgICAgaWYgKHZjdHh0LT5pbm9kZSA9PSBOVUxMKSB7CiAJVkVSUk9SX0lOVCgieG1sU2NoZW1hVmFsaWRhdG9yUHVzaEVsZW0iLAogCSAgICAiY2FsbGluZyB4bWxTY2hlbWFHZXRGcmVzaEVsZW1JbmZvKCkiKTsKIAlyZXR1cm4gKC0xKTsKLSAgICB9ICAgCisgICAgfQogICAgIHZjdHh0LT5uYkF0dHJJbmZvcyA9IDA7CiAgICAgcmV0dXJuICgwKTsKIH0KQEAgLTI1ODk1LDcgKzI1ODk5LDcgQEAKIAogCiAKLS8qIAorLyoKICogUHJvY2VzcyBFTkQgb2YgZWxlbWVudC4KICovCiBzdGF0aWMgaW50CkBAIC0yNTkxNCw3ICsyNTkxOCw3IEBACiAJKi8KIAl2Y3R4dC0+c2tpcERlcHRoID0gdmN0eHQtPmRlcHRoIC0xOwogCWdvdG8gZW5kX2VsZW07Ci0gICAgfSAgICAKKyAgICB9CiAgICAgaWYgKChpbm9kZS0+dHlwZURlZiA9PSBOVUxMKSB8fAogCShpbm9kZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BX05PREVfSU5GT19FUlJfQkFEX1RZUEUpKSB7CiAJLyoKQEAgLTI1OTM0LDggKzI1OTM4LDggQEAKIAkqIFdvcmthcm91bmQgZm9yICJhbnlUeXBlIi4KIAkqLwogCWlmIChpbm9kZS0+dHlwZURlZi0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfQU5ZVFlQRSkKLQkgICAgZ290byBjaGFyYWN0ZXJfY29udGVudDsJCQkKLQkKKwkgICAgZ290byBjaGFyYWN0ZXJfY29udGVudDsKKwogCWlmICgoaW5vZGUtPmZsYWdzICYgWE1MX1NDSEVNQV9FTEVNX0lORk9fRVJSX0JBRF9DT05URU5UKSA9PSAwKSB7CiAJICAgIHhtbENoYXIgKnZhbHVlc1sxMF07CiAJICAgIGludCB0ZXJtaW5hbCwgbmJ2YWwgPSAxMCwgbmJuZWc7CkBAIC0yNTk1NiwxMiArMjU5NjAsMTIgQEAKICNpZmRlZiBERUJVR19BVVRPTUFUQQogCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJICAgICJBVVRPTUFUT04gY3JlYXRlIG9uICclcydcbiIsIGlub2RlLT5sb2NhbE5hbWUpOwotI2VuZGlmCSAgICAKKyNlbmRpZgogCSAgICB9CiAJICAgIC8qCiAJICAgICogR2V0IGhvbGQgb2YgdGhlIHN0aWxsIGV4cGVjdGVkIGNvbnRlbnQsIHNpbmNlIGEgZnVydGhlcgogCSAgICAqIGNhbGwgdG8geG1sUmVnRXhlY1B1c2hTdHJpbmcoKSB3aWxsIGxvb3NlIHRoaXMgaW5mb3JtYXRpb24uCi0JICAgICovIAorCSAgICAqLwogCSAgICB4bWxSZWdFeGVjTmV4dFZhbHVlcyhpbm9kZS0+cmVnZXhDdHh0LAogCQkmbmJ2YWwsICZuYm5lZywgJnZhbHVlc1swXSwgJnRlcm1pbmFsKTsKIAkgICAgcmV0ID0geG1sUmVnRXhlY1B1c2hTdHJpbmcoaW5vZGUtPnJlZ2V4Q3R4dCwgTlVMTCwgTlVMTCk7CkBAIC0yNjAxMSwxNCArMjYwMTUsMTQgQEAKIAkvKgogCSogU3BlZWR1cCBpZiBubyBkZWNsYXJhdGlvbiBleGlzdHMuCiAJKi8KLQlpZiAoV1hTX0lTX1NJTVBMRShpbm9kZS0+dHlwZURlZikpIHsJICAgIAorCWlmIChXWFNfSVNfU0lNUExFKGlub2RlLT50eXBlRGVmKSkgewogCSAgICByZXQgPSB4bWxTY2hlbWFWQ2hlY2tJTm9kZURhdGFUeXBlKHZjdHh0LAogCQlpbm9kZSwgaW5vZGUtPnR5cGVEZWYsIGlub2RlLT52YWx1ZSk7CiAJfSBlbHNlIGlmIChXWFNfSEFTX1NJTVBMRV9DT05URU5UKGlub2RlLT50eXBlRGVmKSkgewogCSAgICByZXQgPSB4bWxTY2hlbWFWQ2hlY2tJTm9kZURhdGFUeXBlKHZjdHh0LAogCQlpbm9kZSwgaW5vZGUtPnR5cGVEZWYtPmNvbnRlbnRUeXBlRGVmLAogCQlpbm9kZS0+dmFsdWUpOwotCX0JCQorCX0KIAlpZiAocmV0IDwgMCkgewogCSAgICBWRVJST1JfSU5UKCJ4bWxTY2hlbWFWYWxpZGF0b3JQb3BFbGVtIiwKIAkJImNhbGxpbmcgeG1sU2NoZW1hVkNoZWNrQ1ZDU2ltcGxlVHlwZSgpIik7CkBAIC0yNjAyNywyNiArMjYwMzEsMjYgQEAKIAlnb3RvIGVuZF9lbGVtOwogICAgIH0KICAgICAvKgotICAgICogY3ZjLWVsdCAoMy4zLjQpIDogNSAKKyAgICAqIGN2Yy1lbHQgKDMuMy40KSA6IDUKICAgICAqIFRoZSBhcHByb3ByaWF0ZSBjYXNlIGFtb25nIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgogICAgICovCiAgICAgLyoKLSAgICAqIGN2Yy1lbHQgKDMuMy40KSA6IDUuMSAKLSAgICAqIElmIHRoZSBkZWNsYXJhdGlvbiBoYXMgYSB7dmFsdWUgY29uc3RyYWludH0sIAotICAgICogdGhlIGl0ZW0gaGFzIG5laXRoZXIgZWxlbWVudCBub3IgY2hhcmFjdGVyIFtjaGlsZHJlbl0gYW5kIAorICAgICogY3ZjLWVsdCAoMy4zLjQpIDogNS4xCisgICAgKiBJZiB0aGUgZGVjbGFyYXRpb24gaGFzIGEge3ZhbHVlIGNvbnN0cmFpbnR9LAorICAgICogdGhlIGl0ZW0gaGFzIG5laXRoZXIgZWxlbWVudCBub3IgY2hhcmFjdGVyIFtjaGlsZHJlbl0gYW5kCiAgICAgKiBjbGF1c2UgMy4yIGhhcyBub3QgYXBwbGllZCwgdGhlbiBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CiAgICAgKi8KICAgICBpZiAoKGlub2RlLT5kZWNsLT52YWx1ZSAhPSBOVUxMKSAmJgotCShpbm9kZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BX0VMRU1fSU5GT19FTVBUWSkgJiYgCisJKGlub2RlLT5mbGFncyAmIFhNTF9TQ0hFTUFfRUxFTV9JTkZPX0VNUFRZKSAmJgogCSghIElOT0RFX05JTExFRChpbm9kZSkpKSB7CiAJLyoKLQkqIGN2Yy1lbHQgKDMuMy40KSA6IDUuMS4xIAotCSogSWYgdGhlILdhY3R1YWwgdHlwZSBkZWZpbml0aW9utyBpcyBhILdsb2NhbCB0eXBlIGRlZmluaXRpb263CisJKiBjdmMtZWx0ICgzLjMuNCkgOiA1LjEuMQorCSogSWYgdGhlIO+/vWFjdHVhbCB0eXBlIGRlZmluaXRpb27vv70gaXMgYSDvv71sb2NhbCB0eXBlIGRlZmluaXRpb27vv70KIAkqIHRoZW4gdGhlIGNhbm9uaWNhbCBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7dmFsdWUgY29uc3RyYWludH0KLQkqIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBkZWZhdWx0IGZvciB0aGUgt2FjdHVhbCB0eXBlIGRlZmluaXRpb263IGFzIAotCSogZGVmaW5lZCBpbiBFbGVtZW50IERlZmF1bHQgVmFsaWQgKEltbWVkaWF0ZSkgKKczLjMuNikuIAorCSogdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGRlZmF1bHQgZm9yIHRoZSDvv71hY3R1YWwgdHlwZSBkZWZpbml0aW9u77+9IGFzCisJKiBkZWZpbmVkIGluIEVsZW1lbnQgRGVmYXVsdCBWYWxpZCAoSW1tZWRpYXRlKSAo77+9My4zLjYpLgogCSovCi0JLyogCisJLyoKIAkqIE5PVEU6ICdsb2NhbCcgYWJvdmUgbWVhbnMgdHlwZXMgYWNxdWlyZWQgYnkgeHNpOnR5cGUuCiAJKiBOT1RFOiBBbHRob3VnaCB0aGUgKmNhbm9uaWNhbCogdmFsdWUgaXMgc3RhdGVkLCBpdCBpcyBub3QKIAkqIHJlbGV2YW50IGlmIGNhbm9uaWNhbCBvciBub3QuIEFkZGl0aW9uYWxseSBYTUwgU2NoZW1hIDEuMQpAQCAtMjYwNjksMjIgKzI2MDczLDIyIEBACiAJICAgICogKHNlZSBmb2xsb3dpbmcpLgogCSAgICAqLwogCSAgICBnb3RvIGRlZmF1bHRfcHN2aTsKLQl9CQorCX0KIAkvKgotCSogY3ZjLWVsdCAoMy4zLjQpIDogNS4xLjIgCi0JKiBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIHdpdGggdGhlIGNhbm9uaWNhbCBsZXhpY2FsIAotCSogcmVwcmVzZW50YXRpb24gb2YgdGhlIHt2YWx1ZSBjb25zdHJhaW50fSB2YWx1ZSB1c2VkIGFzIGl0cyAKLQkqILdub3JtYWxpemVkIHZhbHVltyBtdXN0IGJlILd2YWxpZLcgd2l0aCByZXNwZWN0IHRvIHRoZSAKLQkqILdhY3R1YWwgdHlwZSBkZWZpbml0aW9utyBhcyBkZWZpbmVkIGJ5IEVsZW1lbnQgTG9jYWxseSBWYWxpZCAoVHlwZSkKLQkqICinMy4zLjQpLgotCSovCSAgICAKKwkqIGN2Yy1lbHQgKDMuMy40KSA6IDUuMS4yCisJKiBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIHdpdGggdGhlIGNhbm9uaWNhbCBsZXhpY2FsCisJKiByZXByZXNlbnRhdGlvbiBvZiB0aGUge3ZhbHVlIGNvbnN0cmFpbnR9IHZhbHVlIHVzZWQgYXMgaXRzCisJKiDvv71ub3JtYWxpemVkIHZhbHVl77+9IG11c3QgYmUg77+9dmFsaWTvv70gd2l0aCByZXNwZWN0IHRvIHRoZQorCSog77+9YWN0dWFsIHR5cGUgZGVmaW5pdGlvbu+/vSBhcyBkZWZpbmVkIGJ5IEVsZW1lbnQgTG9jYWxseSBWYWxpZCAoVHlwZSkKKwkqICjvv70zLjMuNCkuCisJKi8KIAlpZiAoV1hTX0lTX1NJTVBMRShpbm9kZS0+dHlwZURlZikpIHsKIAkgICAgcmV0ID0geG1sU2NoZW1hVkNoZWNrSU5vZGVEYXRhVHlwZSh2Y3R4dCwKIAkJaW5vZGUsIGlub2RlLT50eXBlRGVmLCBpbm9kZS0+ZGVjbC0+dmFsdWUpOwogCX0gZWxzZSBpZiAoV1hTX0hBU19TSU1QTEVfQ09OVEVOVChpbm9kZS0+dHlwZURlZikpIHsKIAkgICAgcmV0ID0geG1sU2NoZW1hVkNoZWNrSU5vZGVEYXRhVHlwZSh2Y3R4dCwKIAkJaW5vZGUsIGlub2RlLT50eXBlRGVmLT5jb250ZW50VHlwZURlZiwKLQkJaW5vZGUtPmRlY2wtPnZhbHVlKTsJICAgIAorCQlpbm9kZS0+ZGVjbC0+dmFsdWUpOwogCX0KIAlpZiAocmV0ICE9IDApIHsKIAkgICAgaWYgKHJldCA8IDApIHsKQEAgLTI2MTA1LDcgKzI2MTA5LDcgQEAKIAkgICAgeG1sQ2hhciAqbm9ybVZhbHVlOwogCSAgICAvKgogCSAgICAqIFZBTCBUT0RPOiBOb3JtYWxpemUgdGhlIHZhbHVlLgotCSAgICAqLwkgICAgCisJICAgICovCiAJICAgIG5vcm1WYWx1ZSA9IHhtbFNjaGVtYU5vcm1hbGl6ZVZhbHVlKGlub2RlLT50eXBlRGVmLAogCQlpbm9kZS0+ZGVjbC0+dmFsdWUpOwogCSAgICBpZiAobm9ybVZhbHVlICE9IE5VTEwpIHsKQEAgLTI2MTE4LDQyICsyNjEyMiw0MiBAQAogCQkgICAgImNhbGxpbmcgeG1sTmV3VGV4dCgpIik7CiAJCWdvdG8gaW50ZXJuYWxfZXJyb3I7CiAJICAgIH0gZWxzZQotCQl4bWxBZGRDaGlsZChpbm9kZS0+bm9kZSwgdGV4dENoaWxkKTsJICAgIAorCQl4bWxBZGRDaGlsZChpbm9kZS0+bm9kZSwgdGV4dENoaWxkKTsKIAl9Ci0JCi0gICAgfSBlbHNlIGlmICghIElOT0RFX05JTExFRChpbm9kZSkpIHsJCisKKyAgICB9IGVsc2UgaWYgKCEgSU5PREVfTklMTEVEKGlub2RlKSkgewogCS8qCi0JKiA1LjIuMSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QgCi0JKiB0byB0aGUgt2FjdHVhbCB0eXBlIGRlZmluaXRpb263IGFzIGRlZmluZWQgYnkgRWxlbWVudCBMb2NhbGx5IAotCSogVmFsaWQgKFR5cGUpICinMy4zLjQpLgotCSovCQorCSogNS4yLjEgVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdAorCSogdG8gdGhlIO+/vWFjdHVhbCB0eXBlIGRlZmluaXRpb27vv70gYXMgZGVmaW5lZCBieSBFbGVtZW50IExvY2FsbHkKKwkqIFZhbGlkIChUeXBlKSAo77+9My4zLjQpLgorCSovCiAJaWYgKFdYU19JU19TSU1QTEUoaW5vZGUtPnR5cGVEZWYpKSB7CiAJICAgICAvKgogCSAgICAqIFNQRUMgKGN2Yy10eXBlKSAoMy4xKQogCSAgICAqICJJZiB0aGUgdHlwZSBkZWZpbml0aW9uIGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgLi4uIgogCSAgICAqICgzLjEuMykgIklmIGNsYXVzZSAzLjIgb2YgRWxlbWVudCBMb2NhbGx5IFZhbGlkCi0JICAgICogKEVsZW1lbnQpICinMy4zLjQpIGRpZCBub3QgYXBwbHksIHRoZW4gdGhlILdub3JtYWxpemVkIHZhbHVltwotCSAgICAqIG11c3QgYmUgt3ZhbGlktyB3aXRoIHJlc3BlY3QgdG8gdGhlIHR5cGUgZGVmaW5pdGlvbiBhcyBkZWZpbmVkCi0JICAgICogYnkgU3RyaW5nIFZhbGlkICinMy4xNC40KS4KLQkgICAgKi8JICAgIAorCSAgICAqIChFbGVtZW50KSAo77+9My4zLjQpIGRpZCBub3QgYXBwbHksIHRoZW4gdGhlIO+/vW5vcm1hbGl6ZWQgdmFsdWXvv70KKwkgICAgKiBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdCB0byB0aGUgdHlwZSBkZWZpbml0aW9uIGFzIGRlZmluZWQKKwkgICAgKiBieSBTdHJpbmcgVmFsaWQgKO+/vTMuMTQuNCkuCisJICAgICovCiAJICAgIHJldCA9IHhtbFNjaGVtYVZDaGVja0lOb2RlRGF0YVR5cGUodmN0eHQsCiAJCSAgICBpbm9kZSwgaW5vZGUtPnR5cGVEZWYsIGlub2RlLT52YWx1ZSk7CiAJfSBlbHNlIGlmIChXWFNfSEFTX1NJTVBMRV9DT05URU5UKGlub2RlLT50eXBlRGVmKSkgewogCSAgICAvKgogCSAgICAqIFNQRUMgKGN2Yy10eXBlKSAoMy4yKSAiSWYgdGhlIHR5cGUgZGVmaW5pdGlvbiBpcyBhIGNvbXBsZXggdHlwZQogCSAgICAqIGRlZmluaXRpb24sIHRoZW4gdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGJlCi0JICAgICogt3ZhbGlktyB3aXRoIHJlc3BlY3QgdG8gdGhlIHR5cGUgZGVmaW5pdGlvbiBhcyBwZXIKLQkgICAgKiBFbGVtZW50IExvY2FsbHkgVmFsaWQgKENvbXBsZXggVHlwZSkgKKczLjQuNCk7IgorCSAgICAqIO+/vXZhbGlk77+9IHdpdGggcmVzcGVjdCB0byB0aGUgdHlwZSBkZWZpbml0aW9uIGFzIHBlcgorCSAgICAqIEVsZW1lbnQgTG9jYWxseSBWYWxpZCAoQ29tcGxleCBUeXBlKSAo77+9My40LjQpOyIKIAkgICAgKgogCSAgICAqIFNQRUMgKGN2Yy1jb21wbGV4LXR5cGUpICgyLjIpCi0JICAgICogIklmIHRoZSB7Y29udGVudCB0eXBlfSBpcyBhIHNpbXBsZSB0eXBlIGRlZmluaXRpb24sIC4uLiAKLQkgICAgKiB0aGUgt25vcm1hbGl6ZWQgdmFsdWW3IG9mIHRoZSBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gaXMKLQkgICAgKiC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGF0IHNpbXBsZSB0eXBlIGRlZmluaXRpb24gYXMKLQkgICAgKiBkZWZpbmVkIGJ5IFN0cmluZyBWYWxpZCAopzMuMTQuNCkuIgorCSAgICAqICJJZiB0aGUge2NvbnRlbnQgdHlwZX0gaXMgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uLCAuLi4KKwkgICAgKiB0aGUg77+9bm9ybWFsaXplZCB2YWx1Ze+/vSBvZiB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIGlzCisJICAgICog77+9dmFsaWTvv70gd2l0aCByZXNwZWN0IHRvIHRoYXQgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiBhcworCSAgICAqIGRlZmluZWQgYnkgU3RyaW5nIFZhbGlkICjvv70zLjE0LjQpLiIKIAkgICAgKi8KIAkgICAgcmV0ID0geG1sU2NoZW1hVkNoZWNrSU5vZGVEYXRhVHlwZSh2Y3R4dCwKIAkJaW5vZGUsIGlub2RlLT50eXBlRGVmLT5jb250ZW50VHlwZURlZiwgaW5vZGUtPnZhbHVlKTsKLQl9CQorCX0KIAlpZiAocmV0ICE9IDApIHsKIAkgICAgaWYgKHJldCA8IDApIHsKIAkJVkVSUk9SX0lOVCgieG1sU2NoZW1hVmFsaWRhdG9yUG9wRWxlbSIsCkBAIC0yNjE2Myw3ICsyNjE2Nyw3IEBACiAJICAgIGdvdG8gZW5kX2VsZW07CiAJfQogCS8qCi0JKiA1LjIuMiBJZiB0aGVyZSBpcyBhIGZpeGVkIHt2YWx1ZSBjb25zdHJhaW50fSBhbmQgY2xhdXNlIDMuMiBoYXMgCisJKiA1LjIuMiBJZiB0aGVyZSBpcyBhIGZpeGVkIHt2YWx1ZSBjb25zdHJhaW50fSBhbmQgY2xhdXNlIDMuMiBoYXMKIAkqIG5vdCBhcHBsaWVkLCBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CiAJKi8KIAlpZiAoKGlub2RlLT5kZWNsLT52YWx1ZSAhPSBOVUxMKSAmJgpAQCAtMjYxNzQsNyArMjYxNzgsNyBAQAogCSAgICAqIGRvbmUgb24gY29tcHV0ZWQgdmFsdWVzLgogCSAgICAqLwogCSAgICAvKgotCSAgICAqIDUuMi4yLjEgVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGhhdmUgbm8gZWxlbWVudCAKKwkgICAgKiA1LjIuMi4xIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gbXVzdCBoYXZlIG5vIGVsZW1lbnQKIAkgICAgKiBpbmZvcm1hdGlvbiBpdGVtIFtjaGlsZHJlbl0uCiAJICAgICovCiAJICAgIGlmIChpbm9kZS0+ZmxhZ3MgJgpAQCAtMjYxODYsMjggKzI2MTkwLDI4IEBACiAJCWdvdG8gZW5kX2VsZW07CiAJICAgIH0gZWxzZSB7CiAJCS8qCi0JCSogNS4yLjIuMiBUaGUgYXBwcm9wcmlhdGUgY2FzZSBhbW9uZyB0aGUgZm9sbG93aW5nIG11c3QgCisJCSogNS4yLjIuMiBUaGUgYXBwcm9wcmlhdGUgY2FzZSBhbW9uZyB0aGUgZm9sbG93aW5nIG11c3QKIAkJKiBiZSB0cnVlOgotCQkqLwkJCisJCSovCiAJCWlmIChXWFNfSEFTX01JWEVEX0NPTlRFTlQoaW5vZGUtPnR5cGVEZWYpKSB7CiAJCSAgICAvKgotCQkgICAgKiA1LjIuMi4yLjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSC3YWN0dWFsIHR5cGUgCi0JCSAgICAqIGRlZmluaXRpb263IGlzIG1peGVkLCB0aGVuIHRoZSAqaW5pdGlhbCB2YWx1ZSogb2YgdGhlIAotCQkgICAgKiBpdGVtIG11c3QgbWF0Y2ggdGhlIGNhbm9uaWNhbCBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIAorCQkgICAgKiA1LjIuMi4yLjEgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSDvv71hY3R1YWwgdHlwZQorCQkgICAgKiBkZWZpbml0aW9u77+9IGlzIG1peGVkLCB0aGVuIHRoZSAqaW5pdGlhbCB2YWx1ZSogb2YgdGhlCisJCSAgICAqIGl0ZW0gbXVzdCBtYXRjaCB0aGUgY2Fub25pY2FsIGxleGljYWwgcmVwcmVzZW50YXRpb24KIAkJICAgICogb2YgdGhlIHt2YWx1ZSBjb25zdHJhaW50fSB2YWx1ZS4KIAkJICAgICoKLQkJICAgICogLi4uIHRoZSAqaW5pdGlhbCB2YWx1ZSogb2YgYW4gZWxlbWVudCBpbmZvcm1hdGlvbiAKLQkJICAgICogaXRlbSBpcyB0aGUgc3RyaW5nIGNvbXBvc2VkIG9mLCBpbiBvcmRlciwgdGhlIAotCQkgICAgKiBbY2hhcmFjdGVyIGNvZGVdIG9mIGVhY2ggY2hhcmFjdGVyIGluZm9ybWF0aW9uIGl0ZW0gaW4gCisJCSAgICAqIC4uLiB0aGUgKmluaXRpYWwgdmFsdWUqIG9mIGFuIGVsZW1lbnQgaW5mb3JtYXRpb24KKwkJICAgICogaXRlbSBpcyB0aGUgc3RyaW5nIGNvbXBvc2VkIG9mLCBpbiBvcmRlciwgdGhlCisJCSAgICAqIFtjaGFyYWN0ZXIgY29kZV0gb2YgZWFjaCBjaGFyYWN0ZXIgaW5mb3JtYXRpb24gaXRlbSBpbgogCQkgICAgKiB0aGUgW2NoaWxkcmVuXSBvZiB0aGF0IGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbS4KLQkJICAgICovCQkgICAKKwkJICAgICovCiAJCSAgICBpZiAoISB4bWxTdHJFcXVhbChpbm9kZS0+dmFsdWUsIGlub2RlLT5kZWNsLT52YWx1ZSkpewotCQkJLyogCisJCQkvKgogCQkJKiBWQUwgVE9ETzogUmVwb3J0IGludmFsaWQgJiBleHBlY3RlZCB2YWx1ZXMgYXMgd2VsbC4KIAkJCSogVkFMIFRPRE86IEltcGxlbWVudCB0aGUgY2Fub25pY2FsIHN0dWZmLgogCQkJKi8KIAkJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19FTFRfNV8yXzJfMl8xOwotCQkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgdmN0eHQsIAorCQkJeG1sU2NoZW1hQ3VzdG9tRXJyKEFDVFhUX0NBU1QgdmN0eHQsCiAJCQkgICAgcmV0LCBOVUxMLCBOVUxMLAogCQkJICAgICJUaGUgaW5pdGlhbCB2YWx1ZSAnJXMnIGRvZXMgbm90IG1hdGNoIHRoZSBmaXhlZCAiCiAJCQkgICAgInZhbHVlIGNvbnN0cmFpbnQgJyVzJyIsCkBAIC0yNjIxNiw5ICsyNjIyMCw5IEBACiAJCSAgICB9CiAJCX0gZWxzZSBpZiAoV1hTX0hBU19TSU1QTEVfQ09OVEVOVChpbm9kZS0+dHlwZURlZikpIHsKIAkJICAgIC8qCi0JCSAgICAqIDUuMi4yLjIuMiBJZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlILdhY3R1YWwgdHlwZSAKLQkJICAgICogZGVmaW5pdGlvbrcgaXMgYSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uLCB0aGVuIHRoZSAKLQkJICAgICogKmFjdHVhbCB2YWx1ZSogb2YgdGhlIGl0ZW0gbXVzdCBtYXRjaCB0aGUgY2Fub25pY2FsIAorCQkgICAgKiA1LjIuMi4yLjIgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSDvv71hY3R1YWwgdHlwZQorCQkgICAgKiBkZWZpbml0aW9u77+9IGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiB0aGUKKwkJICAgICogKmFjdHVhbCB2YWx1ZSogb2YgdGhlIGl0ZW0gbXVzdCBtYXRjaCB0aGUgY2Fub25pY2FsCiAJCSAgICAqIGxleGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHt2YWx1ZSBjb25zdHJhaW50fSB2YWx1ZS4KIAkJICAgICovCiAJCSAgICAvKgpAQCAtMjYyMzMsMTYgKzI2MjM3LDE2IEBACiAJCQl4bWxTY2hlbWFDdXN0b21FcnIoQUNUWFRfQ0FTVCB2Y3R4dCwKIAkJCSAgICByZXQsIE5VTEwsIE5VTEwsCiAJCQkgICAgIlRoZSBhY3R1YWwgdmFsdWUgJyVzJyBkb2VzIG5vdCBtYXRjaCB0aGUgZml4ZWQgIgotCQkJICAgICJ2YWx1ZSBjb25zdHJhaW50ICclcyciLCAKKwkJCSAgICAidmFsdWUgY29uc3RyYWludCAnJXMnIiwKIAkJCSAgICBpbm9kZS0+dmFsdWUsCiAJCQkgICAgaW5vZGUtPmRlY2wtPnZhbHVlKTsKIAkJCWdvdG8gZW5kX2VsZW07Ci0JCSAgICB9CQkgICAgCisJCSAgICB9CiAJCX0KLQkgICAgfQkgICAgCisJICAgIH0KIAl9CiAgICAgfQotICAgIAorCiBlbmRfZWxlbToKICAgICBpZiAodmN0eHQtPmRlcHRoIDwgMCkgewogCS8qIFRPRE86IHJhaXNlIGVycm9yPyAqLwpAQCAtMjYyNTIsMTUgKzI2MjU2LDE1IEBACiAJdmN0eHQtPnNraXBEZXB0aCA9IC0xOwogICAgIC8qCiAgICAgKiBFdmFsdWF0ZSB0aGUgaGlzdG9yeSBvZiBYUGF0aCBzdGF0ZSBvYmplY3RzLgotICAgICovICAgIAorICAgICovCiAgICAgaWYgKGlub2RlLT5hcHBsaWVkWFBhdGggJiYKIAkoeG1sU2NoZW1hWFBhdGhQcm9jZXNzSGlzdG9yeSh2Y3R4dCwgdmN0eHQtPmRlcHRoKSA9PSAtMSkpCiAJZ290byBpbnRlcm5hbF9lcnJvcjsKICAgICAvKgogICAgICogTUFZQkUgVE9ETzoKLSAgICAqIFNQRUMgKDYpICJUaGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIG11c3QgYmUgt3ZhbGlktyB3aXRoCisgICAgKiBTUEVDICg2KSAiVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGJlIO+/vXZhbGlk77+9IHdpdGgKICAgICAqIHJlc3BlY3QgdG8gZWFjaCBvZiB0aGUge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9IGFzIHBlcgotICAgICogSWRlbnRpdHktY29uc3RyYWludCBTYXRpc2ZpZWQgKKczLjExLjQpLiIKKyAgICAqIElkZW50aXR5LWNvbnN0cmFpbnQgU2F0aXNmaWVkICjvv70zLjExLjQpLiIKICAgICAqLwogICAgIC8qCiAgICAgKiBQU1ZJIFRPRE86IElmIHdlIGV4cG9zZSBJREMgbm9kZS10YWJsZXMgdmlhIFBTVkkgdGhlbiB0aGUgdGFibGVzCkBAIC0yNjI2OCw3ICsyNjI3Miw3IEBACiAgICAgKiAgIFdlIHdpbGwgY3VycmVudGx5IGJ1aWxkIElEQyBub2RlLXRhYmxlcyBhbmQgYnViYmxlIHRoZW0gb25seSBpZgogICAgICogICBrZXlyZWZzIGRvIGV4aXN0LgogICAgICovCi0gICAgCisKICAgICAvKgogICAgICogQWRkIHRoZSBjdXJyZW50IElEQyB0YXJnZXQtbm9kZXMgdG8gdGhlIElEQyBub2RlLXRhYmxlcy4KICAgICAqLwpAQCAtMjYzMDIsNyArMjYzMDYsNyBAQAogCSAgICAqLwogCSAgICBpZiAoeG1sU2NoZW1hQnViYmxlSURDTm9kZVRhYmxlcyh2Y3R4dCkgPT0gLTEpCiAJCWdvdG8gaW50ZXJuYWxfZXJyb3I7Ci0JfQkKKwl9CiAgICAgfQogICAgIC8qCiAgICAgKiBDbGVhciB0aGUgY3VycmVudCBpZWxlbS4KQEAgLTI2MzM1LDExICsyNjMzOSwxMSBAQAogCSAgICBhaWRjID0gYWlkYy0+bmV4dDsKIAl9IHdoaWxlIChhaWRjICE9IE5VTEwpOwogICAgIH0KLSAgICB2Y3R4dC0+ZGVwdGgtLTsgICAgICAgIAorICAgIHZjdHh0LT5kZXB0aC0tOwogICAgIHZjdHh0LT5pbm9kZSA9IHZjdHh0LT5lbGVtSW5mb3NbdmN0eHQtPmRlcHRoXTsKICAgICAvKgotICAgICogVkFMIFRPRE86IDcgSWYgdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBpcyB0aGUgt3ZhbGlkYXRpb24gcm9vdLcsIGl0IG11c3QgYmUgCi0gICAgKiC3dmFsaWS3IHBlciBWYWxpZGF0aW9uIFJvb3QgVmFsaWQgKElEL0lEUkVGKSAopzMuMy40KS4KKyAgICAqIFZBTCBUT0RPOiA3IElmIHRoZSBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gaXMgdGhlIO+/vXZhbGlkYXRpb24gcm9vdO+/vSwgaXQgbXVzdCBiZQorICAgICog77+9dmFsaWTvv70gcGVyIFZhbGlkYXRpb24gUm9vdCBWYWxpZCAoSUQvSURSRUYpICjvv70zLjMuNCkuCiAgICAgKi8KICAgICByZXR1cm4gKHJldCk7CiAKQEAgLTI2NDIwLDExICsyNjQyNCwxMSBAQAogCQkgKiBGYWxsYmFjayB0byAiYW55VHlwZSIuCiAJCSAqCiAJCSAqIFNQRUMgKGN2Yy1hc3Nlc3MtZWx0KQotCQkgKiAiSWYgdGhlIGl0ZW0gY2Fubm90IGJlILdzdHJpY3RseSBhc3Nlc3NlZLcsIFsuLi5dCisJCSAqICJJZiB0aGUgaXRlbSBjYW5ub3QgYmUg77+9c3RyaWN0bHkgYXNzZXNzZWTvv70sIFsuLi5dCiAJCSAqIGFuIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSdzIHNjaGVtYSB2YWxpZGl0eSBtYXkgYmUgbGF4bHkKLQkJICogYXNzZXNzZWQgaWYgaXRzILdjb250ZXh0LWRldGVybWluZWQgZGVjbGFyYXRpb263IGlzIG5vdAotCQkgKiBza2lwIGJ5ILd2YWxpZGF0aW5ntyB3aXRoIHJlc3BlY3QgdG8gdGhlILd1ci10eXBlCi0JCSAqIGRlZmluaXRpb263IGFzIHBlciBFbGVtZW50IExvY2FsbHkgVmFsaWQgKFR5cGUpICinMy4zLjQpLiIKKwkJICogYXNzZXNzZWQgaWYgaXRzIO+/vWNvbnRleHQtZGV0ZXJtaW5lZCBkZWNsYXJhdGlvbu+/vSBpcyBub3QKKwkJICogc2tpcCBieSDvv712YWxpZGF0aW5n77+9IHdpdGggcmVzcGVjdCB0byB0aGUg77+9dXItdHlwZQorCQkgKiBkZWZpbml0aW9u77+9IGFzIHBlciBFbGVtZW50IExvY2FsbHkgVmFsaWQgKFR5cGUpICjvv70zLjMuNCkuIgogCQkqLwogCQl2Y3R4dC0+aW5vZGUtPnR5cGVEZWYgPQogCQkgICAgeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfQU5ZVFlQRSk7CkBAIC0yNjQ5Niw5ICsyNjUwMCw5IEBACiAJICAgICogU1BFQyAoMi40KSAiSWYgdGhlIHtjb250ZW50IHR5cGV9IGlzIGVsZW1lbnQtb25seSBvciBtaXhlZCwKIAkgICAgKiB0aGVuIHRoZSBzZXF1ZW5jZSBvZiB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtJ3MKIAkgICAgKiBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gW2NoaWxkcmVuXSwgaWYgYW55LCB0YWtlbiBpbgotCSAgICAqIG9yZGVyLCBpcyC3dmFsaWS3IHdpdGggcmVzcGVjdCB0byB0aGUge2NvbnRlbnQgdHlwZX0ncworCSAgICAqIG9yZGVyLCBpcyDvv712YWxpZO+/vSB3aXRoIHJlc3BlY3QgdG8gdGhlIHtjb250ZW50IHR5cGV9J3MKIAkgICAgKiBwYXJ0aWNsZSwgYXMgZGVmaW5lZCBpbiBFbGVtZW50IFNlcXVlbmNlIExvY2FsbHkgVmFsaWQKLQkgICAgKiAoUGFydGljbGUpICinMy45LjQpLiIKKwkgICAgKiAoUGFydGljbGUpICjvv70zLjkuNCkuIgogCSAgICAqLwogCSAgICByZXQgPSB4bWxSZWdFeGVjUHVzaFN0cmluZzIocmVnZXhDdHh0LAogCQl2Y3R4dC0+aW5vZGUtPmxvY2FsTmFtZSwKQEAgLTI2NTk1LDcgKzI2NTk5LDcgQEAKICAgICBpZiAoY29uc3VtZWQgIT0gTlVMTCkKIAkqY29uc3VtZWQgPSAwOwogICAgIGlmIChJTk9ERV9OSUxMRUQodmN0eHQtPmlub2RlKSkgewotCS8qIAorCS8qCiAJKiBTUEVDIGN2Yy1lbHQgKDMuMy40IC0gMy4yLjEpCiAJKiAiVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBtdXN0IGhhdmUgbm8gY2hhcmFjdGVyIG9yCiAJKiBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gW2NoaWxkcmVuXS4iCkBAIC0yNjYxMSw3ICsyNjYxNSw3IEBACiAgICAgKiBpbmZvcm1hdGlvbiBpdGVtIFtjaGlsZHJlbl0uIgogICAgICovCiAgICAgaWYgKHZjdHh0LT5pbm9kZS0+dHlwZURlZi0+Y29udGVudFR5cGUgPT0KLQkgICAgWE1MX1NDSEVNQV9DT05URU5UX0VNUFRZKSB7ICAgIAorCSAgICBYTUxfU0NIRU1BX0NPTlRFTlRfRU1QVFkpIHsKIAlWRVJST1IoWE1MX1NDSEVNQVZfQ1ZDX0NPTVBMRVhfVFlQRV8yXzEsIE5VTEwsCiAJICAgICJDaGFyYWN0ZXIgY29udGVudCBpcyBub3QgYWxsb3dlZCwgIgogCSAgICAiYmVjYXVzZSB0aGUgY29udGVudCB0eXBlIGlzIGVtcHR5Iik7CkBAIC0yNjYyMiwxMiArMjY2MjYsMTIgQEAKIAkgICAgWE1MX1NDSEVNQV9DT05URU5UX0VMRU1FTlRTKSB7CiAJaWYgKChub2RlVHlwZSAhPSBYTUxfVEVYVF9OT0RFKSB8fAogCSAgICAoISB4bWxTY2hlbWFJc0JsYW5rKCh4bWxDaGFyICopIHZhbHVlLCBsZW4pKSkgewotCSAgICAvKiAKLQkgICAgKiBTUEVDIGN2Yy1jb21wbGV4LXR5cGUgKDIuMykgCi0JICAgICogIklmIHRoZSB7Y29udGVudCB0eXBlfSBpcyBlbGVtZW50LW9ubHksIHRoZW4gdGhlIAotCSAgICAqIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSBoYXMgbm8gY2hhcmFjdGVyIGluZm9ybWF0aW9uIAotCSAgICAqIGl0ZW0gW2NoaWxkcmVuXSBvdGhlciB0aGFuIHRob3NlIHdob3NlIFtjaGFyYWN0ZXIgCi0JICAgICogY29kZV0gaXMgZGVmaW5lZCBhcyBhIHdoaXRlIHNwYWNlIGluIFtYTUwgMS4wIChTZWNvbmQgCisJICAgIC8qCisJICAgICogU1BFQyBjdmMtY29tcGxleC10eXBlICgyLjMpCisJICAgICogIklmIHRoZSB7Y29udGVudCB0eXBlfSBpcyBlbGVtZW50LW9ubHksIHRoZW4gdGhlCisJICAgICogZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIGhhcyBubyBjaGFyYWN0ZXIgaW5mb3JtYXRpb24KKwkgICAgKiBpdGVtIFtjaGlsZHJlbl0gb3RoZXIgdGhhbiB0aG9zZSB3aG9zZSBbY2hhcmFjdGVyCisJICAgICogY29kZV0gaXMgZGVmaW5lZCBhcyBhIHdoaXRlIHNwYWNlIGluIFtYTUwgMS4wIChTZWNvbmQKIAkgICAgKiBFZGl0aW9uKV0uIgogCSAgICAqLwogCSAgICBWRVJST1IoWE1MX1NDSEVNQVZfQ1ZDX0NPTVBMRVhfVFlQRV8yXzMsIE5VTEwsCkBAIC0yNjYzNyw3ICsyNjY0MSw3IEBACiAJfQogCXJldHVybiAoMCk7CiAgICAgfQotICAgIAorCiAgICAgaWYgKCh2YWx1ZSA9PSBOVUxMKSB8fCAodmFsdWVbMF0gPT0gMCkpCiAJcmV0dXJuICgwKTsKICAgICAvKgpAQCAtMjY2NDksNyArMjY2NTMsNyBAQAogCSgodmN0eHQtPmlub2RlLT5kZWNsID09IE5VTEwpIHx8CiAJKHZjdHh0LT5pbm9kZS0+ZGVjbC0+dmFsdWUgPT0gTlVMTCkpKQogCXJldHVybiAoMCk7Ci0gICAgCisKICAgICBpZiAodmN0eHQtPmlub2RlLT52YWx1ZSA9PSBOVUxMKSB7CiAJLyoKIAkqIFNldCB0aGUgdmFsdWUuCkBAIC0yNjY5Miw3ICsyNjY5Niw3IEBACiAJICAgIGxlbiA9IHhtbFN0cmxlbih2YWx1ZSk7CiAJLyoKIAkqIENvbmNhdCB0aGUgdmFsdWUuCi0JKi8JCisJKi8KIAlpZiAodmN0eHQtPmlub2RlLT5mbGFncyAmIFhNTF9TQ0hFTUFfTk9ERV9JTkZPX0ZMQUdfT1dORURfVkFMVUVTKSB7CiAJICAgIHZjdHh0LT5pbm9kZS0+dmFsdWUgPSBCQURfQ0FTVCB4bWxTdHJuY2F0KAogCQkoeG1sQ2hhciAqKSB2Y3R4dC0+aW5vZGUtPnZhbHVlLCB2YWx1ZSwgbGVuKTsKQEAgLTI2NzAxLDcgKzI2NzA1LDcgQEAKIAkJQkFEX0NBU1QgeG1sU3RybmNhdE5ldyh2Y3R4dC0+aW5vZGUtPnZhbHVlLCB2YWx1ZSwgbGVuKTsKIAkgICAgdmN0eHQtPmlub2RlLT5mbGFncyB8PSBYTUxfU0NIRU1BX05PREVfSU5GT19GTEFHX09XTkVEX1ZBTFVFUzsKIAl9Ci0gICAgfQkKKyAgICB9CiAKICAgICByZXR1cm4gKDApOwogfQpAQCAtMjY3MTgsNyArMjY3MjIsNyBAQAogCWdvdG8gaW50ZXJuYWxfZXJyb3I7CiAgICAgfQogICAgIGlmICh2Y3R4dC0+eHNpQXNzZW1ibGUpIHsKLQkvKiAKKwkvKgogCSogV2Ugd2lsbCBzdG9wIHZhbGlkYXRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZwogCSogZHluYW1pYyBzY2hlbWEgY29uc3RydWN0aW9uLgogCSogTm90ZSB0aGF0IHdlIHNpbXBseSBzZXQgQHNraXBEZXB0aCB0byAwLCB0aGlzIGNvdWxkCkBAIC0yNjgzMSwxMiArMjY4MzUsMTIgQEAKICAgICAJVkVSUk9SKHJldCwgTlVMTCwKICAgICAJICAgICJUaGUgdHlwZSBkZWZpbml0aW9uIGlzIGFic2VudCIpOwogCWdvdG8gZXhpdDsKLSAgICB9ICAgIAorICAgIH0KICAgICBpZiAodmN0eHQtPmlub2RlLT50eXBlRGVmLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfQUJTVFJBQ1QpIHsKIAl2Y3R4dC0+aW5vZGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFfTk9ERV9JTkZPX0VSUl9CQURfVFlQRTsKIAlyZXQgPSBYTUxfU0NIRU1BVl9DVkNfVFlQRV8yOwogICAgIAkgICAgVkVSUk9SKHJldCwgTlVMTCwKLSAgICAJICAgICJUaGUgdHlwZSBkZWZpbml0aW9uIGlzIGFic3RyYWN0Iik7CQorICAgIAkgICAgIlRoZSB0eXBlIGRlZmluaXRpb24gaXMgYWJzdHJhY3QiKTsKIAlnb3RvIGV4aXQ7CiAgICAgfQogICAgIC8qCkBAIC0yNjkxNyw3ICsyNjkyMSw3IEBACiAJbm9kZVR5cGUgPSB4bWxUZXh0UmVhZGVyTm9kZVR5cGUodmN0eHQtPnJlYWRlcik7CiAKIAlpZiAobm9kZVR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgewotCSAgICAKKwogCSAgICB2Y3R4dC0+ZGVwdGgrKzsKIAkgICAgaWYgKHhtbFNjaGVtYVZhbGlkYXRvclB1c2hFbGVtKHZjdHh0KSA9PSAtMSkgewogCQlWRVJST1JfSU5UKCJ4bWxTY2hlbWFWUmVhZGVyV2FsayIsCkBAIC0yNzA5Miw4ICsyNzA5Niw4IEBACiAqIFByb2Nlc3MgdGV4dCBjb250ZW50LgogKi8KIHN0YXRpYyB2b2lkCi14bWxTY2hlbWFTQVhIYW5kbGVUZXh0KHZvaWQgKmN0eCwgCi0JCSAgICAgICBjb25zdCB4bWxDaGFyICogY2gsIAoreG1sU2NoZW1hU0FYSGFuZGxlVGV4dCh2b2lkICpjdHgsCisJCSAgICAgICBjb25zdCB4bWxDaGFyICogY2gsCiAJCSAgICAgICBpbnQgbGVuKQogewogICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCA9ICh4bWxTY2hlbWFWYWxpZEN0eHRQdHIpIGN0eDsKQEAgLTI3MTE3LDEwICsyNzEyMSwxMCBAQAogKiBQcm9jZXNzIENEQVRBIGNvbnRlbnQuCiAqLwogc3RhdGljIHZvaWQKLXhtbFNjaGVtYVNBWEhhbmRsZUNEYXRhU2VjdGlvbih2b2lkICpjdHgsIAotCQkJICAgICBjb25zdCB4bWxDaGFyICogY2gsIAoreG1sU2NoZW1hU0FYSGFuZGxlQ0RhdGFTZWN0aW9uKHZvaWQgKmN0eCwKKwkJCSAgICAgY29uc3QgeG1sQ2hhciAqIGNoLAogCQkJICAgICBpbnQgbGVuKQoteyAgIAorewogICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dCA9ICh4bWxTY2hlbWFWYWxpZEN0eHRQdHIpIGN0eDsKIAogICAgIGlmICh2Y3R4dC0+ZGVwdGggPCAwKQpAQCAtMjcxNTQsMjAgKzI3MTU4LDIwIEBACiAKIHN0YXRpYyB2b2lkCiB4bWxTY2hlbWFTQVhIYW5kbGVTdGFydEVsZW1lbnROcyh2b2lkICpjdHgsCi0JCQkJIGNvbnN0IHhtbENoYXIgKiBsb2NhbG5hbWUsIAotCQkJCSBjb25zdCB4bWxDaGFyICogcHJlZml4IEFUVFJJQlVURV9VTlVTRUQsIAotCQkJCSBjb25zdCB4bWxDaGFyICogVVJJLCAKLQkJCQkgaW50IG5iX25hbWVzcGFjZXMsIAotCQkJCSBjb25zdCB4bWxDaGFyICoqIG5hbWVzcGFjZXMsIAotCQkJCSBpbnQgbmJfYXR0cmlidXRlcywgCi0JCQkJIGludCBuYl9kZWZhdWx0ZWQgQVRUUklCVVRFX1VOVVNFRCwgCisJCQkJIGNvbnN0IHhtbENoYXIgKiBsb2NhbG5hbWUsCisJCQkJIGNvbnN0IHhtbENoYXIgKiBwcmVmaXggQVRUUklCVVRFX1VOVVNFRCwKKwkJCQkgY29uc3QgeG1sQ2hhciAqIFVSSSwKKwkJCQkgaW50IG5iX25hbWVzcGFjZXMsCisJCQkJIGNvbnN0IHhtbENoYXIgKiogbmFtZXNwYWNlcywKKwkJCQkgaW50IG5iX2F0dHJpYnV0ZXMsCisJCQkJIGludCBuYl9kZWZhdWx0ZWQgQVRUUklCVVRFX1VOVVNFRCwKIAkJCQkgY29uc3QgeG1sQ2hhciAqKiBhdHRyaWJ1dGVzKQoteyAgCit7CiAgICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZjdHh0ID0gKHhtbFNjaGVtYVZhbGlkQ3R4dFB0cikgY3R4OwogICAgIGludCByZXQ7CiAgICAgeG1sU2NoZW1hTm9kZUluZm9QdHIgaWVsZW07CiAgICAgaW50IGksIGo7Ci0gICAgCisKICAgICAvKgogICAgICogU0FYIFZBTCBUT0RPOiBXaGF0IHRvIGRvIHdpdGggbmJfZGVmYXVsdGVkPwogICAgICovCkBAIC0yNzE5NSwxNiArMjcxOTksMTYgQEAKICAgICBpZWxlbS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQV9FTEVNX0lORk9fRU1QVFk7CiAgICAgLyoKICAgICAqIFJlZ2lzdGVyIG5hbWVzcGFjZXMgb24gdGhlIGVsZW0gaW5mby4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIGlmIChuYl9uYW1lc3BhY2VzICE9IDApIHsKIAkvKgogCSogQWx0aG91Z2ggdGhlIHBhcnNlciBidWlsZHMgaXRzIG93biBuYW1lc3BhY2UgbGlzdCwKIAkqIHdlIGhhdmUgbm8gYWNjZXNzIHRvIGl0LCBzbyB3ZSdsbCB1c2UgYW4gb3duIG9uZS4KIAkqLwotICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG5iX25hbWVzcGFjZXM7IGkrKywgaiArPSAyKSB7CSAgICAKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuYl9uYW1lc3BhY2VzOyBpKyssIGogKz0gMikgewogCSAgICAvKgogCSAgICAqIFN0b3JlIHByZWZpeCBhbmQgbmFtZXNwYWNlIG5hbWUuCi0JICAgICovCSAgIAorCSAgICAqLwogCSAgICBpZiAoaWVsZW0tPm5zQmluZGluZ3MgPT0gTlVMTCkgewogCQlpZWxlbS0+bnNCaW5kaW5ncyA9CiAJCSAgICAoY29uc3QgeG1sQ2hhciAqKikgeG1sTWFsbG9jKDEwICoKQEAgLTI3MjQwLDcgKzI3MjQ0LDcgQEAKIAkgICAgfSBlbHNlCiAJCWllbGVtLT5uc0JpbmRpbmdzW2llbGVtLT5uYk5zQmluZGluZ3MgKiAyICsgMV0gPQogCQkgICAgbmFtZXNwYWNlc1tqKzFdOwotCSAgICBpZWxlbS0+bmJOc0JpbmRpbmdzKys7CSAgICAJICAgIAorCSAgICBpZWxlbS0+bmJOc0JpbmRpbmdzKys7CiAJfQogICAgIH0KICAgICAvKgpAQCAtMjcyNTQsNyArMjcyNTgsNyBAQAogICAgICAgICBmb3IgKGogPSAwLCBpID0gMDsgaSA8IG5iX2F0dHJpYnV0ZXM7IGkrKywgaiArPSA1KSB7CiAJICAgIC8qCiAJICAgICogRHVwbGljYXRlIHRoZSB2YWx1ZS4KLQkgICAgKi8JIAorCSAgICAqLwogCSAgICB2YWx1ZSA9IHhtbFN0cm5kdXAoYXR0cmlidXRlc1tqKzNdLAogCQlhdHRyaWJ1dGVzW2orNF0gLSBhdHRyaWJ1dGVzW2orM10pOwogCSAgICAvKgpAQCAtMjcyODEsNyArMjcyODUsNyBAQAogCSAgICBnb3RvIGludGVybmFsX2Vycm9yOwogCX0KIAlnb3RvIGV4aXQ7Ci0gICAgfSAgICAKKyAgICB9CiAKIGV4aXQ6CiAgICAgcmV0dXJuOwpAQCAtMjczOTEsNyArMjczOTUsNyBAQAogI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAogICAgIHZjdHh0LT5yZWFkZXIgPSBOVUxMOwogI2VuZGlmCi0gICAgdmN0eHQtPmhhc0tleXJlZnMgPSAwOyAgICAKKyAgICB2Y3R4dC0+aGFzS2V5cmVmcyA9IDA7CiAKICAgICBpZiAodmN0eHQtPnZhbHVlICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hRnJlZVZhbHVlKHZjdHh0LT52YWx1ZSk7CkBAIC0yNzQ2MSw3ICsyNzQ2NSw3IEBACiAJCWJyZWFrOwogCSAgICB4bWxTY2hlbWFDbGVhckVsZW1JbmZvKHZjdHh0LCBlaSk7CiAJfQotICAgIH0gICAgCisgICAgfQogICAgIHhtbFNjaGVtYUl0ZW1MaXN0Q2xlYXIodmN0eHQtPm5vZGVRTmFtZXMpOwogICAgIC8qIFJlY3JlYXRlIHRoZSBkaWN0LiAqLwogICAgIHhtbERpY3RGcmVlKHZjdHh0LT5kaWN0KTsKQEAgLTI3NTYzLDcgKzI3NTY3LDcgQEAKICAqIEBjdHh0OiB0aGUgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAogICoKICAqIENoZWNrIGlmIGFueSBlcnJvciB3YXMgZGV0ZWN0ZWQgZHVyaW5nIHZhbGlkYXRpb24uCi0gKiAKKyAqCiAgKiBSZXR1cm5zIDEgaWYgdmFsaWQgc28gZmFyLCAwIGlmIGVycm9ycyB3ZXJlIGRldGVjdGVkLCBhbmQgLTEgaW4gY2FzZQogICogICAgICAgICBvZiBpbnRlcm5hbCBlcnJvci4KICAqLwpAQCAtMjc2MjIsNyArMjc2MjYsNyBAQAogCiAvKioKICAqIHhtbFNjaGVtYUdldFZhbGlkRXJyb3JzOgotICogQGN0eHQ6CWEgWE1MLVNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBjdHh0OiBhIFhNTC1TY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CiAgKiBAZXJyOiB0aGUgZXJyb3IgZnVuY3Rpb24gcmVzdWx0CiAgKiBAd2FybjogdGhlIHdhcm5pbmcgZnVuY3Rpb24gcmVzdWx0CiAgKiBAY3R4OiB0aGUgZnVuY3Rpb25zIGNvbnRleHQgcmVzdWx0CkBAIC0yNzY4Myw3ICsyNzY4Nyw3IEBACiAKIC8qKgogICogeG1sU2NoZW1hVmFsaWRDdHh0R2V0T3B0aW9uczoKLSAqIEBjdHh0OglhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBjdHh0OiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKICAqCiAgKiBHZXQgdGhlIHZhbGlkYXRpb24gY29udGV4dCBvcHRpb25zLgogICoKQEAgLTI3NzUxLDcgKzI3NzU1LDcgQEAKIAkJCW5zTmFtZSA9IE5VTEw7CiAJCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0b3JQdXNoQXR0cmlidXRlKHZjdHh0LAogCQkJKHhtbE5vZGVQdHIpIGF0dHIsCi0JCQkvKiAKKwkJCS8qCiAJCQkqIE5vdGUgdGhhdCB3ZSBnaXZlIGl0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUKIAkJCSogcGFyZW50IGVsZW1lbnQuCiAJCQkqLwpAQCAtMjc4MDcsNyArMjc4MTEsNyBAQAogCSAgICAobm9kZS0+dHlwZSA9PSBYTUxfRU5USVRZX1JFRl9OT0RFKSkgewogCSAgICAvKgogCSAgICAqIERPQyBWQUwgVE9ETzogV2hhdCB0byBkbyB3aXRoIGVudGl0aWVzPwotCSAgICAqLwkgICAgCisJICAgICovCiAJICAgIFZFUlJPUl9JTlQoInhtbFNjaGVtYVZEb2NXYWxrIiwKIAkJInRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbnRpdHkgcmVmZXJlbmNlIGluIHRoZSBub2RlLXRyZWUgIgogCQkiY3VycmVudGx5IGJlaW5nIHZhbGlkYXRlZC4gUHJvY2Vzc2luZyBvZiBlbnRpdGllcyB3aXRoICIKQEAgLTI3ODY3LDcgKzI3ODcxLDcgQEAKIHhtbFNjaGVtYVByZVJ1bih4bWxTY2hlbWFWYWxpZEN0eHRQdHIgdmN0eHQpIHsKICAgICAvKgogICAgICogU29tZSBpbml0aWFsaXphdGlvbi4KLSAgICAqLyAgICAKKyAgICAqLwogICAgIHZjdHh0LT5lcnIgPSAwOwogICAgIHZjdHh0LT5uYmVycm9ycyA9IDA7CiAgICAgdmN0eHQtPmRlcHRoID0gLTE7CkBAIC0yNzg4NCw5ICsyNzg4OCw5IEBACiAgICAgKi8KICAgICBpZiAodmN0eHQtPnNjaGVtYSA9PSBOVUxMKSB7CiAJeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBwY3R4dDsKLQkKKwogCXZjdHh0LT54c2lBc3NlbWJsZSA9IDE7Ci0JLyogCisJLyoKIAkqIElmIG5vdCBzY2hlbWEgd2FzIGdpdmVuIHRoZW4gd2Ugd2lsbCBjcmVhdGUgYSBzY2hlbWEKIAkqIGR5bmFtaWNhbGx5IHVzaW5nIFhTSSBzY2hlbWEgbG9jYXRpb25zLgogCSoKQEAgLTI3OTAyLDggKzI3OTA2LDggQEAKIAkqLwogCXZjdHh0LT5zY2hlbWEgPSB4bWxTY2hlbWFOZXdTY2hlbWEocGN0eHQpOwogCWlmICh2Y3R4dC0+c2NoZW1hID09IE5VTEwpCi0JICAgIHJldHVybiAoLTEpOwkJCi0JLyogCisJICAgIHJldHVybiAoLTEpOworCS8qCiAJKiBDcmVhdGUgdGhlIHNjaGVtYSBjb25zdHJ1Y3Rpb24gY29udGV4dC4KIAkqLwogCXBjdHh0LT5jb25zdHJ1Y3RvciA9IHhtbFNjaGVtYUNvbnN0cnVjdGlvbkN0eHRDcmVhdGUocGN0eHQtPmRpY3QpOwpAQCAtMjc5MTQsMTMgKzI3OTE4LDEzIEBACiAJKiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgY29uc3RydWN0b3IgdG8gYmUgYWJsZSB0byBmcmVlIGl0LgogCSovCiAJcGN0eHQtPm93bnNDb25zdHJ1Y3RvciA9IDE7Ci0gICAgfQkKLSAgICAvKiAKLSAgICAqIEF1Z21lbnQgdGhlIElEQyBkZWZpbml0aW9ucyBmb3IgdGhlIG1haW4gc2NoZW1hIGFuZCBhbGwgaW1wb3J0ZWQgb25lcyAKKyAgICB9CisgICAgLyoKKyAgICAqIEF1Z21lbnQgdGhlIElEQyBkZWZpbml0aW9ucyBmb3IgdGhlIG1haW4gc2NoZW1hIGFuZCBhbGwgaW1wb3J0ZWQgb25lcwogICAgICogTk9URTogbWFpbiBzY2hlbWEgaWYgdGhlIGZpcnN0IGluIHRoZSBpbXBvcnRlZCBsaXN0CiAgICAgKi8KICAgICB4bWxIYXNoU2Nhbih2Y3R4dC0+c2NoZW1hLT5zY2hlbWFzSW1wb3J0cywoeG1sSGFzaFNjYW5uZXIpeG1sU2NoZW1hQXVnbWVudEltcG9ydGVkSURDLCB2Y3R4dCk7Ci0gICAgCisKICAgICByZXR1cm4oMCk7CiB9CiAKQEAgLTI4MTA4LDggKzI4MTEyLDggQEAKIHsKICAgICB4bWxTY2hlbWFTQVhQbHVnUHRyIGN0eHQgPSAoeG1sU2NoZW1hU0FYUGx1Z1B0cikgY3R4OwogICAgIGlmICgoY3R4dCAhPSBOVUxMKSAmJiAoY3R4dC0+dXNlcl9zYXggIT0gTlVMTCkgJiYKLSAgICAgICAgKGN0eHQtPnVzZXJfc2F4LT5pbnRlcm5hbFN1YnNldCAhPSBOVUxMKSkKLQljdHh0LT51c2VyX3NheC0+aW50ZXJuYWxTdWJzZXQoY3R4dC0+dXNlcl9kYXRhLCBuYW1lLCBFeHRlcm5hbElELAorICAgICAgICAoY3R4dC0+dXNlcl9zYXgtPmV4dGVybmFsU3Vic2V0ICE9IE5VTEwpKQorCWN0eHQtPnVzZXJfc2F4LT5leHRlcm5hbFN1YnNldChjdHh0LT51c2VyX2RhdGEsIG5hbWUsIEV4dGVybmFsSUQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUlEKTsKIH0KIApAQCAtMjgzMTUsOCArMjgzMTksOCBAQAogICAgIGlmIChjdHh0ID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKICAgICBpZiAoKGN0eHQtPnVzZXJfc2F4ICE9IE5VTEwpICYmCi0gICAgICAgIChjdHh0LT51c2VyX3NheC0+aWdub3JhYmxlV2hpdGVzcGFjZSAhPSBOVUxMKSkKLQljdHh0LT51c2VyX3NheC0+aWdub3JhYmxlV2hpdGVzcGFjZShjdHh0LT51c2VyX2RhdGEsIHZhbHVlLCBsZW4pOworICAgICAgICAoY3R4dC0+dXNlcl9zYXgtPmNkYXRhQmxvY2sgIT0gTlVMTCkpCisJY3R4dC0+dXNlcl9zYXgtPmNkYXRhQmxvY2soY3R4dC0+dXNlcl9kYXRhLCB2YWx1ZSwgbGVuKTsKICAgICBpZiAoY3R4dC0+Y3R4dCAhPSBOVUxMKQogCXhtbFNjaGVtYVNBWEhhbmRsZUNEYXRhU2VjdGlvbihjdHh0LT5jdHh0LCB2YWx1ZSwgbGVuKTsKIH0KQEAgLTI4MzM1LDEwICsyODMzOSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotc3RhcnRFbGVtZW50TnNTcGxpdCh2b2lkICpjdHgsIGNvbnN0IHhtbENoYXIgKiBsb2NhbG5hbWUsIAotCQkgICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeCwgY29uc3QgeG1sQ2hhciAqIFVSSSwgCi0JCSAgICBpbnQgbmJfbmFtZXNwYWNlcywgY29uc3QgeG1sQ2hhciAqKiBuYW1lc3BhY2VzLCAKLQkJICAgIGludCBuYl9hdHRyaWJ1dGVzLCBpbnQgbmJfZGVmYXVsdGVkLCAKK3N0YXJ0RWxlbWVudE5zU3BsaXQodm9pZCAqY3R4LCBjb25zdCB4bWxDaGFyICogbG9jYWxuYW1lLAorCQkgICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeCwgY29uc3QgeG1sQ2hhciAqIFVSSSwKKwkJICAgIGludCBuYl9uYW1lc3BhY2VzLCBjb25zdCB4bWxDaGFyICoqIG5hbWVzcGFjZXMsCisJCSAgICBpbnQgbmJfYXR0cmlidXRlcywgaW50IG5iX2RlZmF1bHRlZCwKIAkJICAgIGNvbnN0IHhtbENoYXIgKiogYXR0cmlidXRlcykgewogICAgIHhtbFNjaGVtYVNBWFBsdWdQdHIgY3R4dCA9ICh4bWxTY2hlbWFTQVhQbHVnUHRyKSBjdHg7CiAgICAgaWYgKGN0eHQgPT0gTlVMTCkKQEAgLTI4MzU3LDcgKzI4MzYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWVuZEVsZW1lbnROc1NwbGl0KHZvaWQgKmN0eCwgY29uc3QgeG1sQ2hhciAqIGxvY2FsbmFtZSwgCitlbmRFbGVtZW50TnNTcGxpdCh2b2lkICpjdHgsIGNvbnN0IHhtbENoYXIgKiBsb2NhbG5hbWUsCiAJCSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4LCBjb25zdCB4bWxDaGFyICogVVJJKSB7CiAgICAgeG1sU2NoZW1hU0FYUGx1Z1B0ciBjdHh0ID0gKHhtbFNjaGVtYVNBWFBsdWdQdHIpIGN0eDsKICAgICBpZiAoY3R4dCA9PSBOVUxMKQpAQCAtMjgzOTgsNyArMjg0MDIsNyBAQAogICAgIG9sZF9zYXggPSAqc2F4OwogICAgIGlmICgob2xkX3NheCAhPSBOVUxMKSAmJiAob2xkX3NheC0+aW5pdGlhbGl6ZWQgIT0gWE1MX1NBWDJfTUFHSUMpKQogICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgaWYgKChvbGRfc2F4ICE9IE5VTEwpICYmIAorICAgIGlmICgob2xkX3NheCAhPSBOVUxMKSAmJgogICAgICAgICAob2xkX3NheC0+c3RhcnRFbGVtZW50TnMgPT0gTlVMTCkgJiYgKG9sZF9zYXgtPmVuZEVsZW1lbnROcyA9PSBOVUxMKSAmJgogICAgICAgICAoKG9sZF9zYXgtPnN0YXJ0RWxlbWVudCAhPSBOVUxMKSB8fCAob2xkX3NheC0+ZW5kRWxlbWVudCAhPSBOVUxMKSkpCiAgICAgICAgIHJldHVybihOVUxMKTsKQEAgLTI4NDE2LDcgKzI4NDIwLDcgQEAKICAgICByZXQtPmN0eHQgPSBjdHh0OwogICAgIHJldC0+dXNlcl9zYXhfcHRyID0gc2F4OwogICAgIHJldC0+dXNlcl9zYXggPSBvbGRfc2F4OwotICAgIGlmIChvbGRfc2F4ID09IE5VTEwpIHsJCisgICAgaWYgKG9sZF9zYXggPT0gTlVMTCkgewogICAgICAgICAvKgogCSAqIGdvIGRpcmVjdCwgbm8gbmVlZCBmb3IgdGhlIHNwbGl0IGJsb2NrIGFuZCBmdW5jdGlvbnMuCiAJICovCkBAIC0yODQzNyw3ICsyODQ0MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIGZvciBlYWNoIGNhbGxiYWNrIHVudXNlZCBieSBTY2hlbWFzIGluaXRpYWxpemUgaXQgdG8gdGhlIFNwbGl0Ci0JKiByb3V0aW5lIG9ubHkgaWYgbm9uIE5VTEwgaW4gdGhlIHVzZXIgYmxvY2ssIHRoaXMgY2FuIHNwZWVkIHVwIAorCSogcm91dGluZSBvbmx5IGlmIG5vbiBOVUxMIGluIHRoZSB1c2VyIGJsb2NrLCB0aGlzIGNhbiBzcGVlZCB1cAogCSogdGhpbmdzIGF0IHRoZSBTQVggbGV2ZWwuCiAJKi8KICAgICAgICAgaWYgKG9sZF9zYXgtPmludGVybmFsU3Vic2V0ICE9IE5VTEwpCkBAIC0yODU5MCw3ICsyODU5NCw3IEBACiAgICAgaWYgKG9wdGlvbnMpCiAgICAgICAgIHhtbEN0eHRVc2VPcHRpb25zKHBjdHh0LCBvcHRpb25zKTsKICNlbmRpZgotICAgIHBjdHh0LT5saW5lbnVtYmVycyA9IDE7ICAgIAorICAgIHBjdHh0LT5saW5lbnVtYmVycyA9IDE7CiAKICAgICBpbnB1dFN0cmVhbSA9IHhtbE5ld0lPSW5wdXRTdHJlYW0ocGN0eHQsIGlucHV0LCBlbmMpOzsKICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gTlVMTCkgewpAQCAtMjg2MTksNyArMjg2MjMsNyBAQAogCXJldCA9IGN0eHQtPnBhcnNlckN0eHQtPmVyck5vOwogCWlmIChyZXQgPT0gMCkKIAkgICAgcmV0ID0gMTsKLSAgICB9ICAgIAorICAgIH0KIAogZG9uZToKICAgICBjdHh0LT5wYXJzZXJDdHh0ID0gTlVMTDsKQEAgLTI4NjU4LDE2ICsyODY2MiwzMyBAQAogCiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChmaWxlbmFtZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgCisKICAgICBpbnB1dCA9IHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoZmlsZW5hbWUsCiAJWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICAgaWYgKGlucHV0ID09IE5VTEwpCiAJcmV0dXJuICgtMSk7CiAgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTdHJlYW0oY3R4dCwgaW5wdXQsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUsCi0JTlVMTCwgTlVMTCk7ICAgIAorCU5VTEwsIE5VTEwpOwogICAgIHJldHVybiAocmV0KTsKIH0KIAorLyoqCisgKiB4bWxTY2hlbWFWYWxpZEN0eHRHZXRQYXJzZXJDdHh0OgorICogQGN0eHQ6IGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAorICoKKyAqIGFsbG93IGFjY2VzcyB0byB0aGUgcGFyc2VyIGNvbnRleHQgb2YgdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBwYXJzZXIgY29udGV4dCBvZiB0aGUgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCBvciBOVUxMCisgKiAgICAgICAgIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK3htbFBhcnNlckN0eHRQdHIKK3htbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQpCit7CisgICAgaWYgKGN0eHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIHJldHVybiAoY3R4dC0+cGFyc2VyQ3R4dCk7Cit9CisKICNkZWZpbmUgYm90dG9tX3htbHNjaGVtYXMKICNpbmNsdWRlICJlbGZnY2NoYWNrLmgiCiAjZW5kaWYgLyogTElCWE1MX1NDSEVNQVNfRU5BQkxFRCAqLwpkaWZmIC0tZ2l0IGEveG1sc2NoZW1hc3R5cGVzLmMgYi94bWxzY2hlbWFzdHlwZXMuYwppbmRleCBhMzVjNTM5Li4wZDk2N2QwIDEwMDY0NAotLS0gYS94bWxzY2hlbWFzdHlwZXMuYworKysgYi94bWxzY2hlbWFzdHlwZXMuYwpAQCAtMjA2Myw3ICsyMDYzLDcgQEAKICAqIFBhcnNlIGFuIHVuc2lnbmVkIGxvbmcgaW50byAzIGZpZWxkcy4KICAqCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGluIHRoZSBudW1iZXIgb3IKLSAqIC0xIGlmIG92ZXJmbG93IG9mIHRoZSBjYXBhY2l0eQorICogLTEgaWYgb3ZlcmZsb3cgb2YgdGhlIGNhcGFjaXR5IGFuZCAtMiBpZiBpdCdzIG5vdCBhIG51bWJlci4KICAqLwogc3RhdGljIGludAogeG1sU2NoZW1hUGFyc2VVSW50KGNvbnN0IHhtbENoYXIgKipzdHIsIHVuc2lnbmVkIGxvbmcgKmxsbywKQEAgLTIwNzIsNiArMjA3Miw5IEBACiAgICAgY29uc3QgeG1sQ2hhciAqdG1wLCAqY3VyID0gKnN0cjsKICAgICBpbnQgcmV0ID0gMCwgaSA9IDA7CiAKKyAgICBpZiAoISgoKmN1ciA+PSAnMCcpICYmICgqY3VyIDw9ICc5JykpKSAKKyAgICAgICAgcmV0dXJuKC0yKTsKKwogICAgIHdoaWxlICgqY3VyID09ICcwJykgeyAgICAgICAgLyogaWdub3JlIGxlYWRpbmcgemVyb2VzICovCiAgICAgICAgIGN1cisrOwogICAgIH0KQEAgLTIzNDIsOSArMjM0NSw5IEBACiAJCQkgICAgKiBUZXJtaW5hdGUgdGhlIChwcmVwYXJzZWQpIHN0cmluZy4KIAkJCSAgICAqLwogCQkJICAgIGlmIChsZW4gIT0gMCkgewotCQkJCSpjcHRyID0gMDsgCisJCQkJKmNwdHIgPSAwOwogCQkJCWNwdHIgPSBjdmFsOwotCQkJCQorCiAJCQkJeG1sU2NoZW1hUGFyc2VVSW50KChjb25zdCB4bWxDaGFyICoqKSZjcHRyLAogCQkJCSAgICAmdi0+dmFsdWUuZGVjaW1hbC5sbywKIAkJCQkgICAgJnYtPnZhbHVlLmRlY2ltYWwubWksCkBAIC0zMTE2LDcgKzMxMTksNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKmN1ciA9PSAnKycpCiAgICAgICAgICAgICAgICAgICAgIGN1cisrOwogICAgICAgICAgICAgICAgIHJldCA9IHhtbFNjaGVtYVBhcnNlVUludCgmY3VyLCAmbG8sICZtaSwgJmhpKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybjE7CiAJCWlmIChub3JtT25UaGVGbHkpCiAJCSAgICB3aGlsZSBJU19XU1BfQkxBTktfQ0goKmN1cikgY3VyKys7CkBAIC0zMTYxLDcgKzMxNjQsNyBAQAogICAgICAgICBjYXNlIFhNTF9TQ0hFTUFTX0JZVEU6CiAgICAgICAgIGNhc2UgWE1MX1NDSEVNQVNfU0hPUlQ6CiAgICAgICAgIGNhc2UgWE1MX1NDSEVNQVNfSU5UOnsKLSAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqY3VyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqY3VyID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsbywgbWksIGhpOwogICAgICAgICAgICAgICAgIGludCBzaWduID0gMDsKIApkaWZmIC0tZ2l0IGEveG1sd3JpdGVyLmMgYi94bWx3cml0ZXIuYwppbmRleCAyZDlkMTA5Li5iODhkZTNhIDEwMDY0NAotLS0gYS94bWx3cml0ZXIuYworKysgYi94bWx3cml0ZXIuYwpAQCAtNjI2LDkgKzYyNiwxMCBAQAogICogeG1sVGV4dFdyaXRlckVuZERvY3VtZW50OgogICogQHdyaXRlcjogIHRoZSB4bWxUZXh0V3JpdGVyUHRyCiAgKgotICogRW5kIGFuIHhtbCBkb2N1bWVudC4gQWxsIG9wZW4gZWxlbWVudHMgYXJlIGNsb3NlZAorICogRW5kIGFuIHhtbCBkb2N1bWVudC4gQWxsIG9wZW4gZWxlbWVudHMgYXJlIGNsb3NlZCwgYW5kCisgKiB0aGUgY29udGVudCBpcyBmbHVzaGVkIHRvIHRoZSBvdXRwdXQuCiAgKgotICogUmV0dXJucyB0aGUgYnl0ZXMgd3JpdHRlbiAobWF5IGJlIDAgYmVjYXVzZSBvZiBidWZmZXJpbmcpIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKKyAqIFJldHVybnMgdGhlIGJ5dGVzIHdyaXR0ZW4gb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgogICovCiBpbnQKIHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCh4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcikKQEAgLTcwMiw2ICs3MDMsOSBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBzdW0gKz0gY291bnQ7CiAgICAgfQorCisgICAgc3VtICs9IHhtbFRleHRXcml0ZXJGbHVzaCh3cml0ZXIpOworCiAgICAgcmV0dXJuIHN1bTsKIH0KIApAQCAtMTIzNiw4ICsxMjQwLDE2IEBACiAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIHN1bSArPSBjb3VudDsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPmluZGVudCkKKyAgICAgICAgICAgICAgICB3cml0ZXItPmRvaW5kZW50ID0gMDsKICAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCiAgICAgICAgIGNhc2UgWE1MX1RFWFRXUklURVJfVEVYVDoKKyAgICAgICAgICAgIGlmICgod3JpdGVyLT5pbmRlbnQpICYmICh3cml0ZXItPmRvaW5kZW50KSkgeworICAgICAgICAgICAgICAgIGNvdW50ID0geG1sVGV4dFdyaXRlcldyaXRlSW5kZW50KHdyaXRlcik7CisgICAgICAgICAgICAgICAgc3VtICs9IGNvdW50OworICAgICAgICAgICAgICAgIHdyaXRlci0+ZG9pbmRlbnQgPSAxOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVyLT5kb2luZGVudCA9IDE7CiAgICAgICAgICAgICBjb3VudCA9IHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKHdyaXRlci0+b3V0LCAiPC8iKTsKICAgICAgICAgICAgIGlmIChjb3VudCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjYxMCw2ICsyNjIyLDcgQEAKICAgICAgICAgaWYgKHAgIT0gMCkgewogICAgICAgICAgICAgc3dpdGNoIChwLT5zdGF0ZSkgewogICAgICAgICAgICAgICAgIGNhc2UgWE1MX1RFWFRXUklURVJfTk9ORToKKwkJY2FzZSBYTUxfVEVYVFdSSVRFUl9URVhUOgogICAgICAgICAgICAgICAgIGNhc2UgWE1MX1RFWFRXUklURVJfUEk6CiAgICAgICAgICAgICAgICAgY2FzZSBYTUxfVEVYVFdSSVRFUl9QSV9URVhUOgogICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3hwYXRoLmMgYi94cGF0aC5jCmluZGV4IDIyYTNmOWQuLjU3NDQyZTYgMTAwNjQ0Ci0tLSBhL3hwYXRoLmMKKysrIGIveHBhdGguYwpAQCAtNTksNyArNTksNyBAQAogI2RlZmluZSBYUEFUSF9TVFJFQU1JTkcKICNlbmRpZgogCi0jZGVmaW5lIFRPRE8gCQkJCQkJCQlcCisjZGVmaW5lIFRPRE8JCQkJCQkJCVwKICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwJCQkJXAogCSAgICAiVW5pbXBsZW1lbnRlZCBibG9jayBhdCAlczolZFxuIiwJCQkJXAogICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKQEAgLTc5LDcgKzc5LDcgQEAKICogWFBfT1BUSU1JWkVEX0ZJTFRFUl9GSVJTVDoKICogSWYgZGVmaW5lZCwgdGhpcyB3aWxsIG9wdGltaXplIGV4cHJlc3Npb25zIGxpa2UgImtleSgnZm9vJywgJ3ZhbCcpW2JdWzFdIgogKiBpbiBhIHdheSwgdGhhdCBpdCBzdG9wIGV2YWx1YXRpb24gYXQgdGhlIGZpcnN0IG5vZGUuCi0qLyAKKyovCiAjZGVmaW5lIFhQX09QVElNSVpFRF9GSUxURVJfRklSU1QKIAogLyoKQEAgLTk5LDkgKzk5LDkgQEAKICNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQkJCQkJCSoKLSAqIAkJCUZsb2F0aW5nIHBvaW50IHN0dWZmCQkJCSoKLSAqIAkJCQkJCQkJCSoKKyAqCQkJCQkJCQkJKgorICoJCQlGbG9hdGluZyBwb2ludCBzdHVmZgkJCQkqCisgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFJJT19SRVBMQUNFX1NURElPCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqIFByb3ZpZGVzIGEgcG9ydGFibGUgaXNuYW4oKSBmdW5jdGlvbiB0byBkZXRlY3Qgd2hldGhlciBhIGRvdWJsZQogICogaXMgYSBOb3RhTnVtYmVyLiBCYXNlZCBvbiB0cmlvIGNvZGUKICAqIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3RyaW8vCi0gKiAKKyAqCiAgKiBSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGlzIGEgTmFOLCAwIG90aGVyd2lzZQogICovCiBpbnQKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICogUHJvdmlkZXMgYSBwb3J0YWJsZSBpc2luZigpIGZ1bmN0aW9uIHRvIGRldGVjdCB3aGV0aGVyIGEgZG91YmxlCiAgKiBpcyBhICtJbmZpbml0ZSBvciAtSW5maW5pdGUuIEJhc2VkIG9uIHRyaW8gY29kZQogICogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jdHJpby8KLSAqIAorICoKICAqIFJldHVybnMgMSB2aSB0aGUgdmFsdWUgaXMgK0luZmluaXRlLCAtMSBpZiAtSW5maW5pdGUsIDAgb3RoZXJ3aXNlCiAgKi8KIGludApAQCAtMTc0LDcgKzE3NCw3IEBACiAgKiBQcm92aWRlcyBhIHBvcnRhYmxlIGZ1bmN0aW9uIHRvIGRldGVjdCB0aGUgc2lnbiBvZiBhIGRvdWJsZQogICogTW9kaWZpZWQgZnJvbSB0cmlvIGNvZGUKICAqIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3RyaW8vCi0gKiAKKyAqCiAgKiBSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGlzIE5lZ2F0aXZlLCAwIGlmIHBvc2l0aXZlCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTE4NywxMSArMTg3LDExIEBACiAgKiBUT0RPOiB3aGVuIGNvbXBhdGliaWxpdHkgYWxsb3dzIHJlbW92ZSBhbGwgImZha2Ugbm9kZSBsaWJ4c2x0IiBzdHJpbmdzCiAgKiAgICAgICB0aGUgdGVzdCBzaG91bGQganVzdCBiZSBuYW1lWzBdID0gJyAnCiAgKi8KLS8qICNkZWZpbmUgREVCVUcgKi8KLS8qICNkZWZpbmUgREVCVUdfU1RFUCAqLwotLyogI2RlZmluZSBERUJVR19TVEVQX05USCAqLwotLyogI2RlZmluZSBERUJVR19FWFBSICovCi0vKiAjZGVmaW5lIERFQlVHX0VWQUxfQ09VTlRTICovCisjaWZkZWYgREVCVUdfWFBBVEhfRVhQUkVTU0lPTgorI2RlZmluZSBERUJVR19TVEVQCisjZGVmaW5lIERFQlVHX0VYUFIKKyNkZWZpbmUgREVCVUdfRVZBTF9DT1VOVFMKKyNlbmRpZgogCiBzdGF0aWMgeG1sTnMgeG1sWFBhdGhYTUxOYW1lc3BhY2VTdHJ1Y3QgPSB7CiAgICAgTlVMTCwKQEAgLTIwMyw3ICsyMDMsNyBAQAogfTsKIHN0YXRpYyB4bWxOc1B0ciB4bWxYUGF0aFhNTE5hbWVzcGFjZSA9ICZ4bWxYUGF0aFhNTE5hbWVzcGFjZVN0cnVjdDsKICNpZm5kZWYgTElCWE1MX1RIUkVBRF9FTkFCTEVECi0vKiAKKy8qCiAgKiBPcHRpbWl6ZXIgaXMgZGlzYWJsZWQgb25seSB3aGVuIHRocmVhZGVkIGFwcHMgYXJlIGRldGVjdGVkIHdoaWxlCiAgKiB0aGUgbGlicmFyeSBhaW4ndCBjb21waWxlZCBmb3IgdGhyZWFkIHNhZmV0eS4KICAqLwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgfQogCiAgICAgLyogY2xlYW51cCBjdXJyZW50IGxhc3QgZXJyb3IgKi8KLSAgICB4bWxSZXNldEVycm9yKCZjdHh0LT5jb250ZXh0LT5sYXN0RXJyb3IpOyAKKyAgICB4bWxSZXNldEVycm9yKCZjdHh0LT5jb250ZXh0LT5sYXN0RXJyb3IpOwogCiAgICAgY3R4dC0+Y29udGV4dC0+bGFzdEVycm9yLmRvbWFpbiA9IFhNTF9GUk9NX1hQQVRIOwogICAgIGN0eHQtPmNvbnRleHQtPmxhc3RFcnJvci5jb2RlID0gZXJyb3IgKyBYTUxfWFBBVEhfRVhQUkVTU0lPTl9PSyAtCkBAIC0zOTAsOSArMzkwLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJCQkJCQkJKgotICogCQkJVXRpbGl0aWVzCSAgICAJCQkJKgotICogCQkJCQkJCQkJKgorICoJCQkJCQkJCQkqCisgKgkJCVV0aWxpdGllcwkJCQkJKgorICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKQEAgLTQxMiw3ICs0MTIsNyBAQAogKiBhbmQgaGVyZSwgd2Ugc2hvdWxkIG1ha2UgdGhlIGZ1bmN0aW9ucyBwdWJsaWMuCiAqLwogc3RhdGljIGludAoteG1sUG9pbnRlckxpc3RBZGRTaXplKHhtbFBvaW50ZXJMaXN0UHRyIGxpc3QsCQkgICAgICAgCit4bWxQb2ludGVyTGlzdEFkZFNpemUoeG1sUG9pbnRlckxpc3RQdHIgbGlzdCwKIAkJICAgICAgIHZvaWQgKml0ZW0sCiAJCSAgICAgICBpbnQgaW5pdGlhbFNpemUpCiB7CkBAIC00ODYsOSArNDg2LDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJCQkJCQkJKgotICogCQkJUGFyc2VyIFR5cGVzCQkJCQkqCi0gKiAJCQkJCQkJCQkqCisgKgkJCQkJCQkJCSoKKyAqCQkJUGFyc2VyIFR5cGVzCQkJCQkqCisgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCkBAIC01MzMsNyArNTMzLDcgQEAKICAgICBBWElTX1BBUkVOVCwKICAgICBBWElTX1BSRUNFRElORywKICAgICBBWElTX1BSRUNFRElOR19TSUJMSU5HLAotICAgIEFYSVNfU0VMRiAgICAKKyAgICBBWElTX1NFTEYKIH0geG1sWFBhdGhBeGlzVmFsOwogCiB0eXBlZGVmIGVudW0gewpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgTk9ERV9UWVBFX05PREUgPSAwLAogICAgIE5PREVfVFlQRV9DT01NRU5UID0gWE1MX0NPTU1FTlRfTk9ERSwKICAgICBOT0RFX1RZUEVfVEVYVCA9IFhNTF9URVhUX05PREUsCi0gICAgTk9ERV9UWVBFX1BJID0gWE1MX1BJX05PREUgICAKKyAgICBOT0RFX1RZUEVfUEkgPSBYTUxfUElfTk9ERQogfSB4bWxYUGF0aFR5cGVWYWw7CiAKICNkZWZpbmUgWFBfUkVXUklURV9ET1NfQ0hJTERfRUxFTSAxCkBAIC01ODcsOSArNTg3LDkgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQkJCQkJCSoKLSAqIAkJCUZvcndhcmQgZGVjbGFyYXRpb25zCQkJCSoKLSAqIAkJCQkJCQkJCSoKKyAqCQkJCQkJCQkJKgorICoJCQlGb3J3YXJkIGRlY2xhcmF0aW9ucwkJCQkqCisgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZAogeG1sWFBhdGhGcmVlVmFsdWVUcmVlKHhtbE5vZGVTZXRQdHIgb2JqKTsKQEAgLTYwNCw5ICs2MDQsOSBAQAogCQkJICAgIGludCBpc1ByZWRpY2F0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQkJCQkJCSoKLSAqIAkJCVBhcnNlciBUeXBlIGZ1bmN0aW9ucyAJCQkJKgotICogCQkJCQkJCQkJKgorICoJCQkJCQkJCQkqCisgKgkJCVBhcnNlciBUeXBlIGZ1bmN0aW9ucwkJCQkqCisgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgpAQCAtNzk2LDE5ICs3OTYsMTkgQEAKICAgICB4bWxYUGF0aENvbXBFeHByQWRkKGN0eHQtPmNvbXAsIGN0eHQtPmNvbXAtPmxhc3QsIC0xLAkJXAogCSAgICAgICAgICAgICAgICAob3ApLCAodmFsKSwgKHZhbDIpLCAodmFsMyksICh2YWw0KSwgKHZhbDUpKQogCi0jZGVmaW5lIFBVU0hfTEVBVkVfRVhQUihvcCwgdmFsLCB2YWwyKSAJCQkJCVwKKyNkZWZpbmUgUFVTSF9MRUFWRV9FWFBSKG9wLCB2YWwsIHZhbDIpCQkJCQlcCiB4bWxYUGF0aENvbXBFeHByQWRkKGN0eHQtPmNvbXAsIC0xLCAtMSwgKG9wKSwgKHZhbCksICh2YWwyKSwgMCAsTlVMTCAsTlVMTCkKIAotI2RlZmluZSBQVVNIX1VOQVJZX0VYUFIob3AsIGNoLCB2YWwsIHZhbDIpIAkJCQlcCisjZGVmaW5lIFBVU0hfVU5BUllfRVhQUihvcCwgY2gsIHZhbCwgdmFsMikJCQkJXAogeG1sWFBhdGhDb21wRXhwckFkZChjdHh0LT5jb21wLCAoY2gpLCAtMSwgKG9wKSwgKHZhbCksICh2YWwyKSwgMCAsTlVMTCAsTlVMTCkKIAotI2RlZmluZSBQVVNIX0JJTkFSWV9FWFBSKG9wLCBjaDEsIGNoMiwgdmFsLCB2YWwyKSAJCQlcCisjZGVmaW5lIFBVU0hfQklOQVJZX0VYUFIob3AsIGNoMSwgY2gyLCB2YWwsIHZhbDIpCQkJXAogeG1sWFBhdGhDb21wRXhwckFkZChjdHh0LT5jb21wLCAoY2gxKSwgKGNoMiksIChvcCksCQkJXAogCQkJKHZhbCksICh2YWwyKSwgMCAsTlVMTCAsTlVMTCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCi0gKiAJCVhQYXRoIG9iamVjdCBjYWNoZSBzdHJ1Y3R1cmVzCQkJCSoKKyAqCQlYUGF0aCBvYmplY3QgY2FjaGUgc3RydWN0dXJlcwkJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTg0MCw4ICs4NDAsOCBAQAogICAgIGludCBkYmdDYWNoZWRMb2NzZXQ7CiAgICAgaW50IGRiZ0NhY2hlZFVzZXJzOwogICAgIGludCBkYmdDYWNoZWRYU0xUVHJlZTsKLSAgICBpbnQgZGJnQ2FjaGVkVW5kZWZpbmVkOyAKLSAgICAKKyAgICBpbnQgZGJnQ2FjaGVkVW5kZWZpbmVkOworCiAKICAgICBpbnQgZGJnUmV1c2VkQWxsOwogICAgIGludCBkYmdSZXVzZWROb2Rlc2V0OwpAQCAtODYwLDExICs4NjAsMTEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCi0gKiAJCURlYnVnZ2luZyByZWxhdGVkIGZ1bmN0aW9ucwkJCQkqCisgKgkJRGVidWdnaW5nIHJlbGF0ZWQgZnVuY3Rpb25zCQkJCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBTVFJBTkdFIAkJCQkJCQlcCisjZGVmaW5lIFNUUkFOR0UJCQkJCQkJXAogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAkJCQlcCiAJICAgICJJbnRlcm5hbCBlcnJvciBhdCAlczolZFxuIiwJCQkJXAogICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKQEAgLTg4Miw3ICs4ODIsNyBAQAogCWZwcmludGYob3V0cHV0LCBzaGlmdCk7CiAJZnByaW50ZihvdXRwdXQsICJOb2RlIGlzIE5VTEwgIVxuIik7CiAJcmV0dXJuOwotICAgICAgICAKKwogICAgIH0KIAogICAgIGlmICgoY3VyLT50eXBlID09IFhNTF9ET0NVTUVOVF9OT0RFKSB8fApAQCAtOTA3LDcgKzkwNyw3IEBACiAJZnByaW50ZihvdXRwdXQsIHNoaWZ0KTsKIAlmcHJpbnRmKG91dHB1dCwgIk5vZGUgaXMgTlVMTCAhXG4iKTsKIAlyZXR1cm47Ci0gICAgICAgIAorCiAgICAgfQogCiAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7CkBAIC05MzAsNyArOTMwLDcgQEAKIAlmcHJpbnRmKG91dHB1dCwgc2hpZnQpOwogCWZwcmludGYob3V0cHV0LCAiTm9kZVNldCBpcyBOVUxMICFcbiIpOwogCXJldHVybjsKLSAgICAgICAgCisKICAgICB9CiAKICAgICBpZiAoY3VyICE9IE5VTEwpIHsKQEAgLTk1Niw3ICs5NTYsNyBAQAogCWZwcmludGYob3V0cHV0LCBzaGlmdCk7CiAJZnByaW50ZihvdXRwdXQsICJWYWx1ZSBUcmVlIGlzIE5VTEwgIVxuIik7CiAJcmV0dXJuOwotICAgICAgICAKKwogICAgIH0KIAogICAgIGZwcmludGYob3V0cHV0LCBzaGlmdCk7CkBAIC05NzcsNyArOTc3LDcgQEAKIAlmcHJpbnRmKG91dHB1dCwgc2hpZnQpOwogCWZwcmludGYob3V0cHV0LCAiTG9jYXRpb25TZXQgaXMgTlVMTCAhXG4iKTsKIAlyZXR1cm47Ci0gICAgICAgIAorCiAgICAgfQogCiAgICAgZm9yIChpID0gMDtpIDwgY3VyLT5sb2NOcjtpKyspIHsKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAgICAgc2hpZnRbMiAqIGldID0gc2hpZnRbMiAqIGkgKyAxXSA9IDA7CiAKIAotICAgIGZwcmludGYob3V0cHV0LCBzaGlmdCk7ICAgIAorICAgIGZwcmludGYob3V0cHV0LCBzaGlmdCk7CiAKICAgICBpZiAoY3VyID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihvdXRwdXQsICJPYmplY3QgaXMgZW1wdHkgKE5VTEwpXG4iKTsKQEAgLTEzMzMsNyArMTMzMyw3IEBACiBzdGF0aWMgaW50IHhtbFhQYXRoRGVidWdPYmpUb3RhbExvY3NldCA9IDA7CiBzdGF0aWMgaW50IHhtbFhQYXRoRGVidWdPYmpUb3RhbFVzZXJzID0gMDsKIHN0YXRpYyBpbnQgeG1sWFBhdGhEZWJ1Z09ialRvdGFsWFNMVFRyZWUgPSAwOwotc3RhdGljIGludCB4bWxYUGF0aERlYnVnT2JqVG90YWxBbGwgPSAwOyAKK3N0YXRpYyBpbnQgeG1sWFBhdGhEZWJ1Z09ialRvdGFsQWxsID0gMDsKIAogc3RhdGljIGludCB4bWxYUGF0aERlYnVnT2JqTWF4VW5kZWZpbmVkID0gMDsKIHN0YXRpYyBpbnQgeG1sWFBhdGhEZWJ1Z09iak1heE5vZGVzZXQgPSAwOwpAQCAtMTM2Niw3ICsxMzY2LDcgQEAKIAkgICAgY2FjaGUtPmRiZ0NhY2hlZExvY3NldCA9IDA7CiAJICAgIGNhY2hlLT5kYmdDYWNoZWRVc2VycyA9IDA7CiAJICAgIGNhY2hlLT5kYmdDYWNoZWRYU0xUVHJlZSA9IDA7Ci0JICAgIGNhY2hlLT5kYmdDYWNoZWRVbmRlZmluZWQgPSAwOyAKKwkgICAgY2FjaGUtPmRiZ0NhY2hlZFVuZGVmaW5lZCA9IDA7CiAKIAkgICAgY2FjaGUtPmRiZ1JldXNlZEFsbCA9IDA7CiAJICAgIGNhY2hlLT5kYmdSZXVzZWROb2Rlc2V0ID0gMDsKQEAgLTEzODAsNyArMTM4MCw3IEBACiAJICAgIGNhY2hlLT5kYmdSZXVzZWRYU0xUVHJlZSA9IDA7CiAJICAgIGNhY2hlLT5kYmdSZXVzZWRVbmRlZmluZWQgPSAwOwogCX0KLSAgICB9ICAgIAorICAgIH0KIAogICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyVW5kZWZpbmVkID0gMDsKICAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlck5vZGVzZXQgPSAwOwpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKICAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlclVzZXJzID0gMDsKICAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlclhTTFRUcmVlID0gMDsKICAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlckFsbCA9IDA7Ci0gICAgCisKICAgICB4bWxYUGF0aERlYnVnT2JqVG90YWxVbmRlZmluZWQgPSAwOwogICAgIHhtbFhQYXRoRGVidWdPYmpUb3RhbE5vZGVzZXQgPSAwOwogICAgIHhtbFhQYXRoRGVidWdPYmpUb3RhbEJvb2wgPSAwOwpAQCAtMTQwNCw3ICsxNDA0LDcgQEAKICAgICB4bWxYUGF0aERlYnVnT2JqVG90YWxMb2NzZXQgPSAwOwogICAgIHhtbFhQYXRoRGVidWdPYmpUb3RhbFVzZXJzID0gMDsKICAgICB4bWxYUGF0aERlYnVnT2JqVG90YWxYU0xUVHJlZSA9IDA7Ci0gICAgeG1sWFBhdGhEZWJ1Z09ialRvdGFsQWxsID0gMDsgCisgICAgeG1sWFBhdGhEZWJ1Z09ialRvdGFsQWxsID0gMDsKIAogICAgIHhtbFhQYXRoRGVidWdPYmpNYXhVbmRlZmluZWQgPSAwOwogICAgIHhtbFhQYXRoRGVidWdPYmpNYXhOb2Rlc2V0ID0gMDsKQEAgLTE0MzAsMTAgKzE0MzAsMTAgQEAKIAlpZiAoY3R4dC0+Y2FjaGUgIT0gTlVMTCkgewogCSAgICB4bWxYUGF0aENvbnRleHRDYWNoZVB0ciBjYWNoZSA9CiAJCSh4bWxYUGF0aENvbnRleHRDYWNoZVB0cikgY3R4dC0+Y2FjaGU7Ci0JICAgIAorCiAJICAgIGlzQ2FjaGVkID0gMTsKLQkgICAgCi0JICAgIGNhY2hlLT5kYmdSZXVzZWRBbGwrKzsJICAgIAorCisJICAgIGNhY2hlLT5kYmdSZXVzZWRBbGwrKzsKIAkgICAgc3dpdGNoIChvYmpUeXBlKSB7CiAJCWNhc2UgWFBBVEhfVU5ERUZJTkVEOgogCQkgICAgY2FjaGUtPmRiZ1JldXNlZFVuZGVmaW5lZCsrOwpAQCAtMTQ2Nyw3ICsxNDY3LDcgQEAKIAkJICAgIGJyZWFrOwogCQlkZWZhdWx0OgogCQkgICAgYnJlYWs7Ci0JICAgIH0JCisJICAgIH0KIAl9CiAgICAgfQogCkBAIC0xNDc1LDcgKzE0NzUsNyBAQAogCWNhc2UgWFBBVEhfVU5ERUZJTkVEOgogCSAgICBpZiAoISBpc0NhY2hlZCkKIAkJeG1sWFBhdGhEZWJ1Z09ialRvdGFsVW5kZWZpbmVkKys7Ci0JICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyVW5kZWZpbmVkKys7CSAgICAKKwkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJVbmRlZmluZWQrKzsKIAkgICAgaWYgKHhtbFhQYXRoRGVidWdPYmpDb3VudGVyVW5kZWZpbmVkID4KIAkJeG1sWFBhdGhEZWJ1Z09iak1heFVuZGVmaW5lZCkKIAkJeG1sWFBhdGhEZWJ1Z09iak1heFVuZGVmaW5lZCA9CkBAIC0xNDg0LDcgKzE0ODQsNyBAQAogCWNhc2UgWFBBVEhfTk9ERVNFVDoKIAkgICAgaWYgKCEgaXNDYWNoZWQpCiAJCXhtbFhQYXRoRGVidWdPYmpUb3RhbE5vZGVzZXQrKzsKLQkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJOb2Rlc2V0Kys7CSAgICAKKwkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJOb2Rlc2V0Kys7CiAJICAgIGlmICh4bWxYUGF0aERlYnVnT2JqQ291bnRlck5vZGVzZXQgPgogCQl4bWxYUGF0aERlYnVnT2JqTWF4Tm9kZXNldCkKIAkJeG1sWFBhdGhEZWJ1Z09iak1heE5vZGVzZXQgPQpAQCAtMTQ5Myw3ICsxNDkzLDcgQEAKIAljYXNlIFhQQVRIX0JPT0xFQU46CiAJICAgIGlmICghIGlzQ2FjaGVkKQogCQl4bWxYUGF0aERlYnVnT2JqVG90YWxCb29sKys7Ci0JICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyQm9vbCsrOwkgICAgCisJICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyQm9vbCsrOwogCSAgICBpZiAoeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJCb29sID4KIAkJeG1sWFBhdGhEZWJ1Z09iak1heEJvb2wpCiAJCXhtbFhQYXRoRGVidWdPYmpNYXhCb29sID0KQEAgLTE1MDIsNyArMTUwMiw3IEBACiAJY2FzZSBYUEFUSF9OVU1CRVI6CiAJICAgIGlmICghIGlzQ2FjaGVkKQogCQl4bWxYUGF0aERlYnVnT2JqVG90YWxOdW1iZXIrKzsKLQkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJOdW1iZXIrKzsJICAgIAorCSAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlck51bWJlcisrOwogCSAgICBpZiAoeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJOdW1iZXIgPgogCQl4bWxYUGF0aERlYnVnT2JqTWF4TnVtYmVyKQogCQl4bWxYUGF0aERlYnVnT2JqTWF4TnVtYmVyID0KQEAgLTE1MTEsNyArMTUxMSw3IEBACiAJY2FzZSBYUEFUSF9TVFJJTkc6CiAJICAgIGlmICghIGlzQ2FjaGVkKQogCQl4bWxYUGF0aERlYnVnT2JqVG90YWxTdHJpbmcrKzsKLQkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJTdHJpbmcrKzsJICAgIAorCSAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlclN0cmluZysrOwogCSAgICBpZiAoeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJTdHJpbmcgPgogCQl4bWxYUGF0aERlYnVnT2JqTWF4U3RyaW5nKQogCQl4bWxYUGF0aERlYnVnT2JqTWF4U3RyaW5nID0KQEAgLTE1MjAsNyArMTUyMCw3IEBACiAJY2FzZSBYUEFUSF9QT0lOVDoKIAkgICAgaWYgKCEgaXNDYWNoZWQpCiAJCXhtbFhQYXRoRGVidWdPYmpUb3RhbFBvaW50Kys7Ci0JICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyUG9pbnQrKzsJICAgIAorCSAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlclBvaW50Kys7CiAJICAgIGlmICh4bWxYUGF0aERlYnVnT2JqQ291bnRlclBvaW50ID4KIAkJeG1sWFBhdGhEZWJ1Z09iak1heFBvaW50KQogCQl4bWxYUGF0aERlYnVnT2JqTWF4UG9pbnQgPQpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAljYXNlIFhQQVRIX1VTRVJTOgogCSAgICBpZiAoISBpc0NhY2hlZCkKIAkJeG1sWFBhdGhEZWJ1Z09ialRvdGFsVXNlcnMrKzsKLQkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJVc2VycysrOwkgICAgCisJICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyVXNlcnMrKzsKIAkgICAgaWYgKHhtbFhQYXRoRGVidWdPYmpDb3VudGVyVXNlcnMgPgogCQl4bWxYUGF0aERlYnVnT2JqTWF4VXNlcnMpCiAJCXhtbFhQYXRoRGVidWdPYmpNYXhVc2VycyA9CkBAIC0xNTU2LDcgKzE1NTYsNyBAQAogCWNhc2UgWFBBVEhfWFNMVF9UUkVFOgogCSAgICBpZiAoISBpc0NhY2hlZCkKIAkJeG1sWFBhdGhEZWJ1Z09ialRvdGFsWFNMVFRyZWUrKzsKLQkgICAgeG1sWFBhdGhEZWJ1Z09iakNvdW50ZXJYU0xUVHJlZSsrOwkgICAgCisJICAgIHhtbFhQYXRoRGVidWdPYmpDb3VudGVyWFNMVFRyZWUrKzsKIAkgICAgaWYgKHhtbFhQYXRoRGVidWdPYmpDb3VudGVyWFNMVFRyZWUgPgogCQl4bWxYUGF0aERlYnVnT2JqTWF4WFNMVFRyZWUpCiAJCXhtbFhQYXRoRGVidWdPYmpNYXhYU0xUVHJlZSA9CkBAIC0xNTg1LDggKzE1ODUsOCBAQAogCSAgICB4bWxYUGF0aENvbnRleHRDYWNoZVB0ciBjYWNoZSA9CiAJCSh4bWxYUGF0aENvbnRleHRDYWNoZVB0cikgY3R4dC0+Y2FjaGU7CiAKLQkgICAgaXNDYWNoZWQgPSAxOwkgICAgCi0JICAgIAorCSAgICBpc0NhY2hlZCA9IDE7CisKIAkgICAgY2FjaGUtPmRiZ0NhY2hlZEFsbCsrOwogCSAgICBzd2l0Y2ggKG9ialR5cGUpIHsKIAkJY2FzZSBYUEFUSF9VTkRFRklORUQ6CkBAIC0xNjIyLDcgKzE2MjIsNyBAQAogCQlkZWZhdWx0OgogCQkgICAgYnJlYWs7CiAJICAgIH0KLQkgICAgCisKIAl9CiAgICAgfQogICAgIHN3aXRjaCAob2JqVHlwZSkgewpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKIAkgICAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgICAgYnJlYWs7Ci0gICAgfSAgIAorICAgIH0KICAgICB4bWxYUGF0aERlYnVnT2JqQ291bnRlckFsbC0tOwogfQogCkBAIC0xNjgxLDcgKzE2ODEsNyBAQAogICAgIHJlcU51bWJlciA9IHhtbFhQYXRoRGVidWdPYmpUb3RhbE51bWJlcjsKICAgICByZXFYU0xUVHJlZSA9IHhtbFhQYXRoRGVidWdPYmpUb3RhbFhTTFRUcmVlOwogICAgIHJlcVVuZGVmaW5lZCA9IHhtbFhQYXRoRGVidWdPYmpUb3RhbFVuZGVmaW5lZDsKLSAgICAKKwogICAgIHByaW50ZigiIyBYUGF0aCBvYmplY3QgdXNhZ2U6XG4iKTsKIAogICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKQEAgLTE3MDMsNyArMTcwMyw3IEBACiAJICAgIHJlcVhTTFRUcmVlICs9IHJlWFNMVFRyZWU7CiAJICAgIHJlVW5kZWZpbmVkID0gY2FjaGUtPmRiZ1JldXNlZFVuZGVmaW5lZDsKIAkgICAgcmVxVW5kZWZpbmVkICs9IHJlVW5kZWZpbmVkOwotCSAgICAKKwogCSAgICBjYUFsbCA9IGNhY2hlLT5kYmdDYWNoZWRBbGw7CiAJICAgIGNhQm9vbCA9IGNhY2hlLT5kYmdDYWNoZWRCb29sOwogCSAgICBjYU5vZGVzZXQgPSBjYWNoZS0+ZGJnQ2FjaGVkTm9kZXNldDsKQEAgLTE3MTEsNyArMTcxMSw3IEBACiAJICAgIGNhTnVtYmVyID0gY2FjaGUtPmRiZ0NhY2hlZE51bWJlcjsKIAkgICAgY2FYU0xUVHJlZSA9IGNhY2hlLT5kYmdDYWNoZWRYU0xUVHJlZTsKIAkgICAgY2FVbmRlZmluZWQgPSBjYWNoZS0+ZGJnQ2FjaGVkVW5kZWZpbmVkOwotCSAgICAKKwogCSAgICBpZiAoY2FjaGUtPm5vZGVzZXRPYmpzKQogCQlsZWZ0T2JqcyAtPSBjYWNoZS0+bm9kZXNldE9ianMtPm51bWJlcjsKIAkgICAgaWYgKGNhY2hlLT5zdHJpbmdPYmpzKQpAQCAtMTcyNCw4ICsxNzI0LDggQEAKIAkJbGVmdE9ianMgLT0gY2FjaGUtPm1pc2NPYmpzLT5udW1iZXI7CiAJfQogICAgIH0KLSAgICAgICAKLSAgICBwcmludGYoIiMgYWxsXG4iKTsgICAgICAgCisKKyAgICBwcmludGYoIiMgYWxsXG4iKTsKICAgICBwcmludGYoIiMgICB0b3RhbCAgOiAlZFxuIiwgcmVxQWxsKTsKICAgICBwcmludGYoIiMgICBsZWZ0ICA6ICVkXG4iLCBsZWZ0T2Jqcyk7CiAgICAgcHJpbnRmKCIjICAgY3JlYXRlZDogJWRcbiIsIHhtbFhQYXRoRGVidWdPYmpUb3RhbEFsbCk7CkBAIC0xODQ4LDcgKzE4NDgsNyBAQAogICAgIGlmIChjYWNoZS0+bnVtYmVyT2JqcykKIAl4bWxYUGF0aENhY2hlRnJlZU9iamVjdExpc3QoY2FjaGUtPm51bWJlck9ianMpOwogICAgIGlmIChjYWNoZS0+bWlzY09ianMpCi0JeG1sWFBhdGhDYWNoZUZyZWVPYmplY3RMaXN0KGNhY2hlLT5taXNjT2Jqcyk7ICAgIAorCXhtbFhQYXRoQ2FjaGVGcmVlT2JqZWN0TGlzdChjYWNoZS0+bWlzY09ianMpOwogICAgIHhtbEZyZWUoY2FjaGUpOwogfQogCkBAIC0xODU3LDcgKzE4NTcsNyBAQAogICoKICAqIEBjdHh0OiAgdGhlIFhQYXRoIGNvbnRleHQKICAqIEBhY3RpdmU6IGVuYWJsZXMvZGlzYWJsZXMgKGNyZWF0ZXMvZnJlZXMpIHRoZSBjYWNoZQotICogQHZhbHVlOiBhIHZhbHVlIHdpdGggc2VtYW50aWNzIGRlcGVuZGFudCBvbiBAb3B0aW9ucyAKKyAqIEB2YWx1ZTogYSB2YWx1ZSB3aXRoIHNlbWFudGljcyBkZXBlbmRhbnQgb24gQG9wdGlvbnMKICAqIEBvcHRpb25zOiBvcHRpb25zIChjdXJyZW50bHkgb25seSB0aGUgdmFsdWUgMCBpcyB1c2VkKQogICoKICAqIENyZWF0ZXMvZnJlZXMgYW4gb2JqZWN0IGNhY2hlIG9uIHRoZSBYUGF0aCBjb250ZXh0LgpAQCAtMTg4NCw3ICsxODg0LDcgQEAKIAlyZXR1cm4oLTEpOwogICAgIGlmIChhY3RpdmUpIHsKIAl4bWxYUGF0aENvbnRleHRDYWNoZVB0ciBjYWNoZTsKLQkKKwogCWlmIChjdHh0LT5jYWNoZSA9PSBOVUxMKSB7CiAJICAgIGN0eHQtPmNhY2hlID0geG1sWFBhdGhOZXdDYWNoZSgpOwogCSAgICBpZiAoY3R4dC0+Y2FjaGUgPT0gTlVMTCkKQEAgLTE5MTksNyArMTkxOSw3IEBACiAgKi8KIHN0YXRpYyB4bWxYUGF0aE9iamVjdFB0cgogeG1sWFBhdGhDYWNoZVdyYXBOb2RlU2V0KHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0LCB4bWxOb2RlU2V0UHRyIHZhbCkKLXsgICAgCit7CiAgICAgaWYgKChjdHh0ICE9IE5VTEwpICYmIChjdHh0LT5jYWNoZSAhPSBOVUxMKSkgewogCXhtbFhQYXRoQ29udGV4dENhY2hlUHRyIGNhY2hlID0KIAkgICAgKHhtbFhQYXRoQ29udGV4dENhY2hlUHRyKSBjdHh0LT5jYWNoZTsKQEAgLTE5MjgsNyArMTkyOCw3IEBACiAJICAgIChjYWNoZS0+bWlzY09ianMtPm51bWJlciAhPSAwKSkKIAl7CiAJICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldDsKLQkgICAgCisKIAkgICAgcmV0ID0gKHhtbFhQYXRoT2JqZWN0UHRyKQogCQljYWNoZS0+bWlzY09ianMtPml0ZW1zWy0tY2FjaGUtPm1pc2NPYmpzLT5udW1iZXJdOwogCSAgICByZXQtPnR5cGUgPSBYUEFUSF9OT0RFU0VUOwpAQCAtMTkzNiwxMiArMTkzNiwxMiBAQAogI2lmZGVmIFhQX0RFQlVHX09CSl9VU0FHRQogCSAgICB4bWxYUGF0aERlYnVnT2JqVXNhZ2VSZXF1ZXN0ZWQoY3R4dCwgWFBBVEhfTk9ERVNFVCk7CiAjZW5kaWYKLQkgICAgcmV0dXJuKHJldCk7CSAgICAKKwkgICAgcmV0dXJuKHJldCk7CiAJfQogICAgIH0KLQkgICAgCisKICAgICByZXR1cm4oeG1sWFBhdGhXcmFwTm9kZVNldCh2YWwpKTsKLSAgICAKKwogfQogCiAvKioKQEAgLTE5NTYsMTYgKzE5NTYsMTYgQEAKICAqLwogc3RhdGljIHhtbFhQYXRoT2JqZWN0UHRyCiB4bWxYUGF0aENhY2hlV3JhcFN0cmluZyh4bWxYUGF0aENvbnRleHRQdHIgY3R4dCwgeG1sQ2hhciAqdmFsKQoteyAgICAKK3sKICAgICBpZiAoKGN0eHQgIT0gTlVMTCkgJiYgKGN0eHQtPmNhY2hlICE9IE5VTEwpKSB7CiAJeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIgY2FjaGUgPSAoeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIpIGN0eHQtPmNhY2hlOwogCiAJaWYgKChjYWNoZS0+c3RyaW5nT2JqcyAhPSBOVUxMKSAmJgogCSAgICAoY2FjaGUtPnN0cmluZ09ianMtPm51bWJlciAhPSAwKSkKIAl7Ci0JCisKIAkgICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0OwotCSAgICAKKwogCSAgICByZXQgPSAoeG1sWFBhdGhPYmplY3RQdHIpCiAJCWNhY2hlLT5zdHJpbmdPYmpzLT5pdGVtc1stLWNhY2hlLT5zdHJpbmdPYmpzLT5udW1iZXJdOwogCSAgICByZXQtPnR5cGUgPSBYUEFUSF9TVFJJTkc7CkBAIC0yMDE0LDIwICsyMDE0LDIwIEBACiAKIAlpZiAoKGNhY2hlLT5ub2Rlc2V0T2JqcyAhPSBOVUxMKSAmJgogCSAgICAoY2FjaGUtPm5vZGVzZXRPYmpzLT5udW1iZXIgIT0gMCkpCi0JewkKKwl7CiAJICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldDsKIAkgICAgLyoKIAkgICAgKiBVc2UgdGhlIG5vZHNldC1jYWNoZS4KLQkgICAgKi8JICAgIAorCSAgICAqLwogCSAgICByZXQgPSAoeG1sWFBhdGhPYmplY3RQdHIpCiAJCWNhY2hlLT5ub2Rlc2V0T2Jqcy0+aXRlbXNbLS1jYWNoZS0+bm9kZXNldE9ianMtPm51bWJlcl07CiAJICAgIHJldC0+dHlwZSA9IFhQQVRIX05PREVTRVQ7CiAJICAgIHJldC0+Ym9vbHZhbCA9IDA7Ci0JICAgIGlmICh2YWwpIHsJCQorCSAgICBpZiAodmFsKSB7CiAJCWlmICgocmV0LT5ub2Rlc2V0dmFsLT5ub2RlTWF4ID09IDApIHx8CiAJCSAgICAodmFsLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkpCiAJCXsKLQkJICAgIHhtbFhQYXRoTm9kZVNldEFkZFVuaXF1ZShyZXQtPm5vZGVzZXR2YWwsIHZhbCk7CQkKKwkJICAgIHhtbFhQYXRoTm9kZVNldEFkZFVuaXF1ZShyZXQtPm5vZGVzZXR2YWwsIHZhbCk7CiAJCX0gZWxzZSB7CiAJCSAgICByZXQtPm5vZGVzZXR2YWwtPm5vZGVUYWJbMF0gPSB2YWw7CiAJCSAgICByZXQtPm5vZGVzZXR2YWwtPm5vZGVOciA9IDE7CkBAIC0yMDcyLDE1ICsyMDcyLDE1IEBACiAgKi8KIHN0YXRpYyB4bWxYUGF0aE9iamVjdFB0cgogeG1sWFBhdGhDYWNoZU5ld0NTdHJpbmcoeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQsIGNvbnN0IGNoYXIgKnZhbCkKLXsgICAgCit7CiAgICAgaWYgKChjdHh0ICE9IE5VTEwpICYmIChjdHh0LT5jYWNoZSkpIHsKIAl4bWxYUGF0aENvbnRleHRDYWNoZVB0ciBjYWNoZSA9ICh4bWxYUGF0aENvbnRleHRDYWNoZVB0cikgY3R4dC0+Y2FjaGU7CiAKIAlpZiAoKGNhY2hlLT5zdHJpbmdPYmpzICE9IE5VTEwpICYmCiAJICAgIChjYWNoZS0+c3RyaW5nT2Jqcy0+bnVtYmVyICE9IDApKQotCXsJCisJewogCSAgICB4bWxYUGF0aE9iamVjdFB0ciByZXQ7Ci0JICAgIAorCiAJICAgIHJldCA9ICh4bWxYUGF0aE9iamVjdFB0cikKIAkJY2FjaGUtPnN0cmluZ09ianMtPml0ZW1zWy0tY2FjaGUtPnN0cmluZ09ianMtPm51bWJlcl07CiAKQEAgLTIxMjEsMTUgKzIxMjEsMTUgQEAKICAqLwogc3RhdGljIHhtbFhQYXRoT2JqZWN0UHRyCiB4bWxYUGF0aENhY2hlTmV3U3RyaW5nKHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0LCBjb25zdCB4bWxDaGFyICp2YWwpCi17ICAgIAorewogICAgIGlmICgoY3R4dCAhPSBOVUxMKSAmJiAoY3R4dC0+Y2FjaGUpKSB7CiAJeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIgY2FjaGUgPSAoeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIpIGN0eHQtPmNhY2hlOwogCiAJaWYgKChjYWNoZS0+c3RyaW5nT2JqcyAhPSBOVUxMKSAmJgogCSAgICAoY2FjaGUtPnN0cmluZ09ianMtPm51bWJlciAhPSAwKSkKLQl7CQorCXsKIAkgICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0OwotCSAgICAKKwogCSAgICByZXQgPSAoeG1sWFBhdGhPYmplY3RQdHIpCiAJCWNhY2hlLT5zdHJpbmdPYmpzLT5pdGVtc1stLWNhY2hlLT5zdHJpbmdPYmpzLT5udW1iZXJdOwogCSAgICByZXQtPnR5cGUgPSBYUEFUSF9TVFJJTkc7CkBAIC0yMTc1LDE1ICsyMTc1LDE1IEBACiAgKi8KIHN0YXRpYyB4bWxYUGF0aE9iamVjdFB0cgogeG1sWFBhdGhDYWNoZU5ld0Jvb2xlYW4oeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQsIGludCB2YWwpCi17ICAgIAorewogICAgIGlmICgoY3R4dCAhPSBOVUxMKSAmJiAoY3R4dC0+Y2FjaGUpKSB7CiAJeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIgY2FjaGUgPSAoeG1sWFBhdGhDb250ZXh0Q2FjaGVQdHIpIGN0eHQtPmNhY2hlOwogCiAJaWYgKChjYWNoZS0+Ym9vbGVhbk9ianMgIT0gTlVMTCkgJiYKIAkgICAgKGNhY2hlLT5ib29sZWFuT2Jqcy0+bnVtYmVyICE9IDApKQotCXsJCisJewogCSAgICB4bWxYUGF0aE9iamVjdFB0ciByZXQ7Ci0JICAgIAorCiAJICAgIHJldCA9ICh4bWxYUGF0aE9iamVjdFB0cikKIAkJY2FjaGUtPmJvb2xlYW5PYmpzLT5pdGVtc1stLWNhY2hlLT5ib29sZWFuT2Jqcy0+bnVtYmVyXTsKIAkgICAgcmV0LT50eXBlID0gWFBBVEhfQk9PTEVBTjsKQEAgLTIyMjksOSArMjIyOSw5IEBACiAKIAlpZiAoKGNhY2hlLT5udW1iZXJPYmpzICE9IE5VTEwpICYmCiAJICAgIChjYWNoZS0+bnVtYmVyT2Jqcy0+bnVtYmVyICE9IDApKQotCXsJCisJewogCSAgICB4bWxYUGF0aE9iamVjdFB0ciByZXQ7Ci0JICAgIAorCiAJICAgIHJldCA9ICh4bWxYUGF0aE9iamVjdFB0cikKIAkJY2FjaGUtPm51bWJlck9ianMtPml0ZW1zWy0tY2FjaGUtPm51bWJlck9ianMtPm51bWJlcl07CiAJICAgIHJldC0+dHlwZSA9IFhQQVRIX05VTUJFUjsKQEAgLTIyNzMsNyArMjI3Myw3IEBACiAKIHN0YXRpYyB4bWxYUGF0aE9iamVjdFB0cgogeG1sWFBhdGhDYWNoZUNvbnZlcnRTdHJpbmcoeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQsIHhtbFhQYXRoT2JqZWN0UHRyIHZhbCkgewotICAgIHhtbENoYXIgKnJlcyA9IE5VTEw7ICAgIAorICAgIHhtbENoYXIgKnJlcyA9IE5VTEw7CiAKICAgICBpZiAodmFsID09IE5VTEwpCiAJcmV0dXJuKHhtbFhQYXRoQ2FjaGVOZXdDU3RyaW5nKGN0eHQsICIiKSk7CkBAIC0yMzU3LDcgKzIzNTcsNyBAQAogc3RhdGljIHhtbFhQYXRoT2JqZWN0UHRyCiB4bWxYUGF0aENhY2hlQ29udmVydEJvb2xlYW4oeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQsIHhtbFhQYXRoT2JqZWN0UHRyIHZhbCkgewogICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldDsKLSAgICAKKwogICAgIGlmICh2YWwgPT0gTlVMTCkKIAlyZXR1cm4oeG1sWFBhdGhDYWNoZU5ld0Jvb2xlYW4oY3R4dCwgMCkpOwogICAgIGlmICh2YWwtPnR5cGUgPT0gWFBBVEhfQk9PTEVBTikKQEAgLTIzODEsNyArMjM4MSw3IEBACiBzdGF0aWMgeG1sWFBhdGhPYmplY3RQdHIKIHhtbFhQYXRoQ2FjaGVDb252ZXJ0TnVtYmVyKHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0LCB4bWxYUGF0aE9iamVjdFB0ciB2YWwpIHsKICAgICB4bWxYUGF0aE9iamVjdFB0ciByZXQ7Ci0gICAgCisKICAgICBpZiAodmFsID09IE5VTEwpCiAJcmV0dXJuKHhtbFhQYXRoQ2FjaGVOZXdGbG9hdChjdHh0LCAwLjApKTsKICAgICBpZiAodmFsLT50eXBlID09IFhQQVRIX05VTUJFUikKQEAgLTIzOTMsNyArMjM5Myw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgotICogCQlQYXJzZXIgc3RhY2tzIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBtYWNyb3MJCSoKKyAqCQlQYXJzZXIgc3RhY2tzIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBtYWNyb3MJCSoKICAqCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjYzMiw3ICsyNjMyLDcgQEAKIAogI2RlZmluZSBORVhUTChsKSAgY3R4dC0+Y3VyICs9IGwKIAotI2RlZmluZSBTS0lQX0JMQU5LUyAJCQkJCQkJXAorI2RlZmluZSBTS0lQX0JMQU5LUwkJCQkJCQlcCiAgICAgd2hpbGUgKElTX0JMQU5LX0NIKCooY3R4dC0+Y3VyKSkpIE5FWFQKIAogI2RlZmluZSBDVVJSRU5UICgqY3R4dC0+Y3VyKQpAQCAtMzAwMSwxNyArMzAwMSwxNyBAQAogCiAgICAgaWYgKG5vZGUxID09IG5vZGUyKQogCXJldHVybigwKTsKLSAgIAorCiAgICAgLyoKICAgICAgKiBhIGNvdXBsZSBvZiBvcHRpbWl6YXRpb25zIHdoaWNoIHdpbGwgYXZvaWQgY29tcHV0YXRpb25zIGluIG1vc3QgY2FzZXMKLSAgICAgKi8gICAgCisgICAgICovCiAgICAgc3dpdGNoIChub2RlMS0+dHlwZSkgewogCWNhc2UgWE1MX0VMRU1FTlRfTk9ERToKIAkgICAgaWYgKG5vZGUyLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKIAkJaWYgKCgwID4gKGxvbmcpIG5vZGUxLT5jb250ZW50KSAmJiAvKiBUT0RPOiBXb3VsZCBhICE9IDAgc3VmZmljZSBoZXJlPyAqLwogCQkgICAgKDAgPiAobG9uZykgbm9kZTItPmNvbnRlbnQpICYmCiAJCSAgICAobm9kZTEtPmRvYyA9PSBub2RlMi0+ZG9jKSkKLQkJewkJCisJCXsKIAkJICAgIGwxID0gLSgobG9uZykgbm9kZTEtPmNvbnRlbnQpOwogCQkgICAgbDIgPSAtKChsb25nKSBub2RlMi0+Y29udGVudCk7CiAJCSAgICBpZiAobDEgPCBsMikKQEAgLTMwMTksNyArMzAxOSw3IEBACiAJCSAgICBpZiAobDEgPiBsMikKIAkJCXJldHVybigtMSk7CiAJCX0gZWxzZQotCQkgICAgZ290byB0dXJ0bGVfY29tcGFyaXNvbjsJCSAgICAKKwkJICAgIGdvdG8gdHVydGxlX2NvbXBhcmlzb247CiAJICAgIH0KIAkgICAgYnJlYWs7CiAJY2FzZSBYTUxfQVRUUklCVVRFX05PREU6CkBAIC0zMDM1LDcgKzMwMzUsNyBAQAogCSAgICBtaXNjTm9kZTEgPSBub2RlMTsKIAkgICAgLyoKIAkgICAgKiBGaW5kIG5lYXJlc3QgZWxlbWVudCBub2RlLgotCSAgICAqLwkgICAgCisJICAgICovCiAJICAgIGlmIChub2RlMS0+cHJldiAhPSBOVUxMKSB7CiAJCWRvIHsKIAkJICAgIG5vZGUxID0gbm9kZTEtPnByZXY7CkBAIC0zMDc1LDkgKzMwNzUsOSBAQAogCSAgICByZXR1cm4oMSk7CiAJZGVmYXVsdDoKIAkgICAgYnJlYWs7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgc3dpdGNoIChub2RlMi0+dHlwZSkgewotCWNhc2UgWE1MX0VMRU1FTlRfTk9ERToJICAgIAorCWNhc2UgWE1MX0VMRU1FTlRfTk9ERToKIAkgICAgYnJlYWs7CiAJY2FzZSBYTUxfQVRUUklCVVRFX05PREU6CiAJICAgIHByZWNlZGVuY2UyID0gMTsgLyogZWxlbWVudCBpcyBvd25lciAqLwpAQCAtMzEwNiw3ICszMTA2LDcgQEAKIAkgICAgfSBlbHNlIHsKIAkJcHJlY2VkZW5jZTIgPSAyOyAvKiBlbGVtZW50IGlzIHBhcmVudCAqLwogCQlub2RlMiA9IG5vZGUyLT5wYXJlbnQ7Ci0JICAgIH0JICAgIAorCSAgICB9CiAJICAgIGlmICgobm9kZTIgPT0gTlVMTCkgfHwgKG5vZGUyLT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpIHx8CiAJCSgwIDw9IChsb25nKSBub2RlMS0+Y29udGVudCkpCiAJICAgIHsKQEAgLTMxNDQsMTEgKzMxNDQsMTEgQEAKIAkJKiAgIElzIHRoaXMgMTAwJSBjb3JyZWN0PwogCQkqLwogCQlpZiAocHJlY2VkZW5jZTEgPCBwcmVjZWRlbmNlMikKLQkJICAgIHJldHVybigxKTsgCisJCSAgICByZXR1cm4oMSk7CiAJCWVsc2UKLQkJICAgIHJldHVybigtMSk7CSAgICAKKwkJICAgIHJldHVybigtMSk7CiAJICAgIH0KLQl9ICAgIAorCX0KIAkvKgogCSogU3BlY2lhbCBjYXNlOiBPbmUgb2YgdGhlIGhlbHBlci1lbGVtZW50cyBpcyBjb250YWluZWQgYnkgdGhlIG90aGVyLgogCSogPGZvbz4KQEAgLTMxNTcsNyArMzE1Nyw3IEBACiAJKiAgIDwvbm9kZTI+CiAJKiAgIFRleHQtNihwcmVjZWRlbmNlMiA9PSAzKQogCSogPC9mb28+Ci0JKi8JCisJKi8KIAlpZiAoKHByZWNlZGVuY2UyID09IDMpICYmIChwcmVjZWRlbmNlMSA+IDEpKSB7CiAJICAgIGN1ciA9IG5vZGUxLT5wYXJlbnQ7CiAJICAgIHdoaWxlIChjdXIpIHsKQEAgLTMxNjYsNyArMzE2Niw3IEBACiAJCWN1ciA9IGN1ci0+cGFyZW50OwogCSAgICB9CiAJfQotCWlmICgocHJlY2VkZW5jZTEgPT0gMykgJiYgKHByZWNlZGVuY2UyID4gMSkpIHsJCisJaWYgKChwcmVjZWRlbmNlMSA9PSAzKSAmJiAocHJlY2VkZW5jZTIgPiAxKSkgewogCSAgICBjdXIgPSBub2RlMi0+cGFyZW50OwogCSAgICB3aGlsZSAoY3VyKSB7CiAJCWlmIChjdXIgPT0gbm9kZTEpCkBAIC0zMTc0LDE2ICszMTc0LDE2IEBACiAJCWN1ciA9IGN1ci0+cGFyZW50OwogCSAgICB9CiAJfQotICAgIH0gICAgICAgIAorICAgIH0KIAogICAgIC8qCiAgICAgICogU3BlZWR1cCB1c2luZyBkb2N1bWVudCBvcmRlciBpZiBhdmFpbGJsZS4KICAgICAgKi8KLSAgICBpZiAoKG5vZGUxLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpICYmCQorICAgIGlmICgobm9kZTEtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgJiYKIAkobm9kZTItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgJiYKIAkoMCA+IChsb25nKSBub2RlMS0+Y29udGVudCkgJiYKIAkoMCA+IChsb25nKSBub2RlMi0+Y29udGVudCkgJiYKLQkobm9kZTEtPmRvYyA9PSBub2RlMi0+ZG9jKSkgewkKKwkobm9kZTEtPmRvYyA9PSBub2RlMi0+ZG9jKSkgewogCiAJbDEgPSAtKChsb25nKSBub2RlMS0+Y29udGVudCk7CiAJbDIgPSAtKChsb25nKSBub2RlMi0+Y29udGVudCk7CkBAIC0zMjUxLDcgKzMyNTEsNyBAQAogCShub2RlMi0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSAmJgogCSgwID4gKGxvbmcpIG5vZGUxLT5jb250ZW50KSAmJgogCSgwID4gKGxvbmcpIG5vZGUyLT5jb250ZW50KSAmJgotCShub2RlMS0+ZG9jID09IG5vZGUyLT5kb2MpKSB7CQorCShub2RlMS0+ZG9jID09IG5vZGUyLT5kb2MpKSB7CiAKIAlsMSA9IC0oKGxvbmcpIG5vZGUxLT5jb250ZW50KTsKIAlsMiA9IC0oKGxvbmcpIG5vZGUyLT5jb250ZW50KTsKQEAgLTMzMzksOSArMzMzOSw5IEBACiAgICAgbWVtc2V0KGN1ciwgMCwgc2l6ZW9mKHhtbE5zKSk7CiAgICAgY3VyLT50eXBlID0gWE1MX05BTUVTUEFDRV9ERUNMOwogICAgIGlmIChucy0+aHJlZiAhPSBOVUxMKQotCWN1ci0+aHJlZiA9IHhtbFN0cmR1cChucy0+aHJlZik7IAorCWN1ci0+aHJlZiA9IHhtbFN0cmR1cChucy0+aHJlZik7CiAgICAgaWYgKG5zLT5wcmVmaXggIT0gTlVMTCkKLQljdXItPnByZWZpeCA9IHhtbFN0cmR1cChucy0+cHJlZml4KTsgCisJY3VyLT5wcmVmaXggPSB4bWxTdHJkdXAobnMtPnByZWZpeCk7CiAgICAgY3VyLT5uZXh0ID0gKHhtbE5zUHRyKSBub2RlOwogICAgIHJldHVybigoeG1sTm9kZVB0cikgY3VyKTsKIH0KQEAgLTM0MzUsNyArMzQzNSw3IEBACiAJcmV0dXJuKE5VTEwpOwogICAgIH0KICAgICBtZW1zZXQocmV0LT5ub2RlVGFiLCAwICwgc2l6ZSAqIChzaXplX3QpIHNpemVvZih4bWxOb2RlUHRyKSk7Ci0gICAgcmV0LT5ub2RlTWF4ID0gc2l6ZTsgIAorICAgIHJldC0+bm9kZU1heCA9IHNpemU7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTM0ODgsNyArMzQ4OCw3IEBACiB4bWxYUGF0aE5vZGVTZXRBZGROcyh4bWxOb2RlU2V0UHRyIGN1ciwgeG1sTm9kZVB0ciBub2RlLCB4bWxOc1B0ciBucykgewogICAgIGludCBpOwogCi0gICAgCisKICAgICBpZiAoKGN1ciA9PSBOVUxMKSB8fCAobnMgPT0gTlVMTCkgfHwgKG5vZGUgPT0gTlVMTCkgfHwKICAgICAgICAgKG5zLT50eXBlICE9IFhNTF9OQU1FU1BBQ0VfREVDTCkgfHwKIAkobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFKSkKQEAgLTM1ODcsNyArMzU4Nyw3IEBACiAgICAgaWYgKHZhbC0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpIHsKIAl4bWxOc1B0ciBucyA9ICh4bWxOc1B0cikgdmFsOwogCi0JY3VyLT5ub2RlVGFiW2N1ci0+bm9kZU5yKytdID0gCisJY3VyLT5ub2RlVGFiW2N1ci0+bm9kZU5yKytdID0KIAkgICAgeG1sWFBhdGhOb2RlU2V0RHVwTnMoKHhtbE5vZGVQdHIpIG5zLT5uZXh0LCBucyk7CiAgICAgfSBlbHNlCiAJY3VyLT5ub2RlVGFiW2N1ci0+bm9kZU5yKytdID0gdmFsOwpAQCAtMzYzOSw3ICszNjM5LDcgQEAKICAgICBpZiAodmFsLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkgewogCXhtbE5zUHRyIG5zID0gKHhtbE5zUHRyKSB2YWw7CiAKLQljdXItPm5vZGVUYWJbY3VyLT5ub2RlTnIrK10gPSAKKwljdXItPm5vZGVUYWJbY3VyLT5ub2RlTnIrK10gPQogCSAgICB4bWxYUGF0aE5vZGVTZXREdXBOcygoeG1sTm9kZVB0cikgbnMtPm5leHQsIG5zKTsKICAgICB9IGVsc2UKIAljdXItPm5vZGVUYWJbY3VyLT5ub2RlTnIrK10gPSB2YWw7CkBAIC0zNjYzLDYgKzM2NjMsOCBAQAogICAgIGlmICh2YWwyID09IE5VTEwpIHJldHVybih2YWwxKTsKICAgICBpZiAodmFsMSA9PSBOVUxMKSB7CiAJdmFsMSA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZShOVUxMKTsKKyAgICBpZiAodmFsMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKE5VTEwpOwogI2lmIDAKIAkvKgogCSogVE9ETzogVGhlIG9wdGltaXphdGlvbiB3b24ndCB3b3JrIGluIGV2ZXJ5IGNhc2UsIHNpbmNlCkBAIC0zNjcyLDcgKzM2NzQsNyBAQAogCSogIElmIHRoZXJlIHdhcyBhIGZsYWcgb24gdGhlIG5vZGVzZXR2YWwsIGluZGljYXRpbmcgdGhhdAogCSogIHNvbWUgdGVtcG9yYXJ5IG5vZGVzIGFyZSBpbiwgdGhhdCB3b3VsZCBiZSBoZWxwZnVsbC4KIAkqLwotCS8qCQorCS8qCiAJKiBPcHRpbWl6YXRpb246IENyZWF0ZSBhbiBlcXVhbGx5IHNpemVkIG5vZGUtc2V0CiAJKiBhbmQgbWVtY3B5IHRoZSBjb250ZW50LgogCSovCkBAIC0zNjk2LDcgKzM2OTgsNyBAQAogICAgIGluaXROciA9IHZhbDEtPm5vZGVOcjsKIAogICAgIGZvciAoaSA9IDA7aSA8IHZhbDItPm5vZGVOcjtpKyspIHsKLQluMiA9IHZhbDItPm5vZGVUYWJbaV07IAorCW4yID0gdmFsMi0+bm9kZVRhYltpXTsKIAkvKgogCSAqIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlcwogCSAqLwpAQCAtMzcwNyw3ICszNzA5LDcgQEAKIAkJc2tpcCA9IDE7CiAJCWJyZWFrOwogCSAgICB9IGVsc2UgaWYgKChuMS0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpICYmCi0JCSAgICAgICAobjItPnR5cGUgPT0gWE1MX05BTUVTUEFDRV9ERUNMKSkgewkJCisJCSAgICAgICAobjItPnR5cGUgPT0gWE1MX05BTUVTUEFDRV9ERUNMKSkgewogCQlpZiAoKCgoeG1sTnNQdHIpIG4xKS0+bmV4dCA9PSAoKHhtbE5zUHRyKSBuMiktPm5leHQpICYmCiAJCSAgICAoeG1sU3RyRXF1YWwoKCh4bWxOc1B0cikgbjEpLT5wcmVmaXgsCiAJCQkoKHhtbE5zUHRyKSBuMiktPnByZWZpeCkpKQpAQCAtMzc3Niw2ICszNzc4LDggQEAKICAgICBpZiAodmFsMSA9PSBOVUxMKSB7CiAJdmFsMSA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZShOVUxMKTsKICAgICB9CisgICAgaWYgKHZhbDEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKIAogICAgIC8qIEBAIHdpdGhfbnMgdG8gY2hlY2sgd2hldGhlciBuYW1lc3BhY2Ugbm9kZXMgc2hvdWxkIGJlIGxvb2tlZCBhdCBAQCAqLwogCkBAIC0zODUyLDkgKzM4NTYsMTEgQEAKIAl4bWxOb2RlUHRyIG4xLCBuMjsKIAogCWlmIChzZXQxID09IE5VTEwpCi0JICAgIAlzZXQxID0geG1sWFBhdGhOb2RlU2V0Q3JlYXRlKE5VTEwpOworICAgICAgICAgICAgc2V0MSA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZShOVUxMKTsKKyAgICAgICAgaWYgKHNldDEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAKLQlpbml0TmJTZXQxID0gc2V0MS0+bm9kZU5yOyAgICAgICAgCisJaW5pdE5iU2V0MSA9IHNldDEtPm5vZGVOcjsKIAlmb3IgKGkgPSAwO2kgPCBzZXQyLT5ub2RlTnI7aSsrKSB7CiAJICAgIG4yID0gc2V0Mi0+bm9kZVRhYltpXTsKIAkgICAgLyoKQEAgLTM4NjcsMTEgKzM4NzMsMTEgQEAKIAkgICAgKi8KIAkgICAgZm9yIChqID0gMDsgaiA8IGluaXROYlNldDE7IGorKykgewogCQluMSA9IHNldDEtPm5vZGVUYWJbal07Ci0JCWlmIChuMSA9PSBuMikgewkJICAgIAorCQlpZiAobjEgPT0gbjIpIHsKIAkJICAgIGdvdG8gc2tpcF9ub2RlOwogCQl9IGVsc2UgaWYgKChuMS0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpICYmCiAJCSAgICAobjItPnR5cGUgPT0gWE1MX05BTUVTUEFDRV9ERUNMKSkKLQkJewkJCisJCXsKIAkJICAgIGlmICgoKCh4bWxOc1B0cikgbjEpLT5uZXh0ID09ICgoeG1sTnNQdHIpIG4yKS0+bmV4dCkgJiYKIAkJCSh4bWxTdHJFcXVhbCgoKHhtbE5zUHRyKSBuMSktPnByZWZpeCwKIAkJCSgoeG1sTnNQdHIpIG4yKS0+cHJlZml4KSkpCkBAIC0zOTAwLDcgKzM5MDYsNyBAQAogCQlzZXQxLT5ub2RlTWF4ID0gWE1MX05PREVTRVRfREVGQVVMVDsKIAkgICAgfSBlbHNlIGlmIChzZXQxLT5ub2RlTnIgPj0gc2V0MS0+bm9kZU1heCkgewogCQl4bWxOb2RlUHRyICp0ZW1wOwotCQkKKwogCQlzZXQxLT5ub2RlTWF4ICo9IDI7CiAJCXRlbXAgPSAoeG1sTm9kZVB0ciAqKSB4bWxSZWFsbG9jKAogCQkgICAgc2V0MS0+bm9kZVRhYiwgc2V0MS0+bm9kZU1heCAqIHNpemVvZih4bWxOb2RlUHRyKSk7CkBAIC0zOTEyLDcgKzM5MTgsNyBAQAogCSAgICB9CiAJICAgIGlmIChuMi0+dHlwZSA9PSBYTUxfTkFNRVNQQUNFX0RFQ0wpIHsKIAkJeG1sTnNQdHIgbnMgPSAoeG1sTnNQdHIpIG4yOwotCQkKKwogCQlzZXQxLT5ub2RlVGFiW3NldDEtPm5vZGVOcisrXSA9CiAJCSAgICB4bWxYUGF0aE5vZGVTZXREdXBOcygoeG1sTm9kZVB0cikgbnMtPm5leHQsIG5zKTsKIAkgICAgfSBlbHNlCkBAIC0zOTQwLDcgKzM5NDYsNyBAQAogc3RhdGljIHhtbE5vZGVTZXRQdHIKIHhtbFhQYXRoTm9kZVNldE1lcmdlQW5kQ2xlYXJOb0R1cGxzKHhtbE5vZGVTZXRQdHIgc2V0MSwgeG1sTm9kZVNldFB0ciBzZXQyLAogCQkJCSAgICBpbnQgaGFzTnVsbEVudHJpZXMpCi17ICAgIAorewogICAgIGlmIChzZXQyID09IE5VTEwpCiAJcmV0dXJuKHNldDEpOwogICAgIGlmICgoc2V0MSA9PSBOVUxMKSAmJiAoaGFzTnVsbEVudHJpZXMgPT0gMCkpIHsKQEAgLTM5NjIsMTQgKzM5NjgsMTYgQEAKIAogCWlmIChzZXQxID09IE5VTEwpCiAJICAgIHNldDEgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7Ci0gICAKKyAgICAgICAgaWYgKHNldDEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisKIAlmb3IgKGkgPSAwO2kgPCBzZXQyLT5ub2RlTnI7aSsrKSB7CiAJICAgIG4yID0gc2V0Mi0+bm9kZVRhYltpXTsKIAkgICAgLyoKIAkgICAgKiBTa2lwIE5VTExlZCBlbnRyaWVzLgogCSAgICAqLwogCSAgICBpZiAobjIgPT0gTlVMTCkKLQkJY29udGludWU7CQorCQljb250aW51ZTsKIAkgICAgaWYgKHNldDEtPm5vZGVNYXggPT0gMCkgewogCQlzZXQxLT5ub2RlVGFiID0gKHhtbE5vZGVQdHIgKikgeG1sTWFsbG9jKAogCQkgICAgWE1MX05PREVTRVRfREVGQVVMVCAqIHNpemVvZih4bWxOb2RlUHRyKSk7CkBAIC0zOTgyLDcgKzM5OTAsNyBAQAogCQlzZXQxLT5ub2RlTWF4ID0gWE1MX05PREVTRVRfREVGQVVMVDsKIAkgICAgfSBlbHNlIGlmIChzZXQxLT5ub2RlTnIgPj0gc2V0MS0+bm9kZU1heCkgewogCQl4bWxOb2RlUHRyICp0ZW1wOwotCQkKKwogCQlzZXQxLT5ub2RlTWF4ICo9IDI7CiAJCXRlbXAgPSAoeG1sTm9kZVB0ciAqKSB4bWxSZWFsbG9jKAogCQkgICAgc2V0MS0+bm9kZVRhYiwgc2V0MS0+bm9kZU1heCAqIHNpemVvZih4bWxOb2RlUHRyKSk7CkBAIC00MDIxLDcgKzQwMjksNyBAQAogCiAgICAgaWYgKGkgPj0gY3VyLT5ub2RlTnIpIHsJLyogbm90IGZvdW5kICovCiAjaWZkZWYgREVCVUcKLSAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsIAorICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkgICAgICAgICJ4bWxYUGF0aE5vZGVTZXREZWw6IE5vZGUgJXMgd2Fzbid0IGZvdW5kIGluIE5vZGVMaXN0XG4iLAogCQl2YWwtPm5hbWUpOwogI2VuZGlmCkBAIC00MDgxLDcgKzQwODksNyBAQAogLyoqCiAgKiB4bWxYUGF0aE5vZGVTZXRDbGVhcjoKICAqIEBzZXQ6ICB0aGUgbm9kZSBzZXQgdG8gY2xlYXIKLSAqIAorICoKICAqIENsZWFycyB0aGUgbGlzdCBmcm9tIGFsbCB0ZW1wb3JhcnkgWFBhdGggb2JqZWN0cyAoZS5nLiBuYW1lc3BhY2Ugbm9kZXMKICAqIGFyZSBmZWVkKSwgYnV0IGRvZXMgKm5vdCogZnJlZSB0aGUgbGlzdCBpdHNlbGYuIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUKICAqIGxpc3QgdG8gMC4KQEAgLTQwOTQsMTMgKzQxMDIsMTMgQEAKICAgICBlbHNlIGlmIChoYXNOc05vZGVzKSB7CiAJaW50IGk7CiAJeG1sTm9kZVB0ciBub2RlOwotCQorCiAJZm9yIChpID0gMDsgaSA8IHNldC0+bm9kZU5yOyBpKyspIHsKIAkgICAgbm9kZSA9IHNldC0+bm9kZVRhYltpXTsKIAkgICAgaWYgKChub2RlICE9IE5VTEwpICYmCiAJCShub2RlLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkpCiAJCXhtbFhQYXRoTm9kZVNldEZyZWVOcygoeG1sTnNQdHIpIG5vZGUpOwotCX0JCisJfQogICAgIH0KICAgICBzZXQtPm5vZGVOciA9IDA7CiB9CkBAIC00MTA5LDcgKzQxMTcsNyBAQAogICogeG1sWFBhdGhOb2RlU2V0Q2xlYXJGcm9tUG9zOgogICogQHNldDogdGhlIG5vZGUgc2V0IHRvIGJlIGNsZWFyZWQKICAqIEBwb3M6IHRoZSBzdGFydCBwb3NpdGlvbiB0byBjbGVhciBmcm9tCi0gKiAKKyAqCiAgKiBDbGVhcnMgdGhlIGxpc3QgZnJvbSB0ZW1wb3JhcnkgWFBhdGggb2JqZWN0cyAoZS5nLiBuYW1lc3BhY2Ugbm9kZXMKICAqIGFyZSBmZWVkKSBzdGFydGluZyB3aXRoIHRoZSBlbnRyeSBhdCBAcG9zLCBidXQgZG9lcyAqbm90KiBmcmVlIHRoZSBsaXN0CiAgKiBpdHNlbGYuIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCB0byBAcG9zLgpAQCAtNDEyMiwxMyArNDEzMCwxMyBAQAogICAgIGVsc2UgaWYgKChoYXNOc05vZGVzKSkgewogCWludCBpOwogCXhtbE5vZGVQdHIgbm9kZTsKLQkKKwogCWZvciAoaSA9IHBvczsgaSA8IHNldC0+bm9kZU5yOyBpKyspIHsKIAkgICAgbm9kZSA9IHNldC0+bm9kZVRhYltpXTsKIAkgICAgaWYgKChub2RlICE9IE5VTEwpICYmCiAJCShub2RlLT50eXBlID09IFhNTF9OQU1FU1BBQ0VfREVDTCkpCiAJCXhtbFhQYXRoTm9kZVNldEZyZWVOcygoeG1sTnNQdHIpIG5vZGUpOwotCX0JCisJfQogICAgIH0KICAgICBzZXQtPm5vZGVOciA9IHBvczsKIH0KQEAgLTQyODEsOCArNDI4OSw5IEBACiAgICAgICAgIHJldCA9IHhtbFhQYXRoTmV3Tm9kZVNldChOVUxMKTsKICAgICBlbHNlIHsKICAgICAgICAgcmV0ID0geG1sWFBhdGhOZXdOb2RlU2V0KHZhbC0+bm9kZVRhYlswXSk7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCB2YWwtPm5vZGVOcjsgKytpKQotICAgICAgICAgICAgeG1sWFBhdGhOb2RlU2V0QWRkVW5pcXVlKHJldC0+bm9kZXNldHZhbCwgdmFsLT5ub2RlVGFiW2ldKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB2YWwtPm5vZGVOcjsgKytpKQorICAgICAgICAgICAgICAgIHhtbFhQYXRoTm9kZVNldEFkZFVuaXF1ZShyZXQtPm5vZGVzZXR2YWwsIHZhbC0+bm9kZVRhYltpXSk7CiAgICAgfQogCiAgICAgcmV0dXJuIChyZXQpOwpAQCAtNDM4MSw2ICs0MzkwLDggQEAKICAgICBpbnQgaSwgbDE7CiAgICAgeG1sTm9kZVB0ciBjdXI7CiAKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybihyZXQpOwogICAgIGlmICh4bWxYUGF0aE5vZGVTZXRJc0VtcHR5KG5vZGVzMSkpCiAJcmV0dXJuKHJldCk7CiAgICAgaWYgKHhtbFhQYXRoTm9kZVNldElzRW1wdHkobm9kZXMyKSkKQEAgLTQ0MDIsNyArNDQxMyw3IEBACiAgKgogICogSW1wbGVtZW50cyB0aGUgRVhTTFQgLSBTZXRzIGRpc3RpbmN0KCkgZnVuY3Rpb246CiAgKiAgICBub2RlLXNldCBzZXQ6ZGlzdGluY3QgKG5vZGUtc2V0KQotICogCisgKgogICogUmV0dXJucyBhIHN1YnNldCBvZiB0aGUgbm9kZXMgY29udGFpbmVkIGluIEBub2Rlcywgb3IgQG5vZGVzIGlmCiAgKiAgICAgICAgIGl0IGlzIGVtcHR5CiAgKi8KQEAgLTQ0MTgsNiArNDQyOSw4IEBACiAJcmV0dXJuKG5vZGVzKTsKIAogICAgIHJldCA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZShOVUxMKTsKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybihyZXQpOwogICAgIGwgPSB4bWxYUGF0aE5vZGVTZXRHZXRMZW5ndGgobm9kZXMpOwogICAgIGhhc2ggPSB4bWxIYXNoQ3JlYXRlIChsKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CkBAIC00NTA2LDYgKzQ1MTksOCBAQAogCXJldHVybihub2Rlcyk7CiAKICAgICByZXQgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4ocmV0KTsKICAgICBpZiAoeG1sWFBhdGhOb2RlU2V0SXNFbXB0eShub2RlcykgfHwKIAkoIXhtbFhQYXRoTm9kZVNldENvbnRhaW5zKG5vZGVzLCBub2RlKSkpCiAJcmV0dXJuKHJldCk7CkBAIC00NjA4LDYgKzQ2MjMsOCBAQAogCXJldHVybihub2Rlcyk7CiAKICAgICByZXQgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4ocmV0KTsKICAgICBpZiAoeG1sWFBhdGhOb2RlU2V0SXNFbXB0eShub2RlcykgfHwKIAkoIXhtbFhQYXRoTm9kZVNldENvbnRhaW5zKG5vZGVzLCBub2RlKSkpCiAJcmV0dXJuKHJldCk7CkBAIC00NzA1LDcgKzQ3MjIsNyBAQAogICoKICAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgZXJyb3IKICAqLwotaW50CQkgIAoraW50CiB4bWxYUGF0aFJlZ2lzdGVyRnVuYyh4bWxYUGF0aENvbnRleHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqbmFtZSwKIAkJICAgICB4bWxYUGF0aEZ1bmN0aW9uIGYpIHsKICAgICByZXR1cm4oeG1sWFBhdGhSZWdpc3RlckZ1bmNOUyhjdHh0LCBuYW1lLCBOVUxMLCBmKSk7CkBAIC00Nzk5LDcgKzQ4MTYsNyBAQAogeG1sWFBhdGhGdW5jdGlvbkxvb2t1cE5TKHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0LCBjb25zdCB4bWxDaGFyICpuYW1lLAogCQkJIGNvbnN0IHhtbENoYXIgKm5zX3VyaSkgewogICAgIHhtbFhQYXRoRnVuY3Rpb24gcmV0OwotICAgIAorCiAgICAgaWYgKGN0eHQgPT0gTlVMTCkKIAlyZXR1cm4oTlVMTCk7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKQEAgLTQ4NTMsNyArNDg3MCw3IEBACiAgKgogICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgLTEgaW4gY2FzZSBvZiBlcnJvcgogICovCi1pbnQJCSAgCitpbnQKIHhtbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZSh4bWxYUGF0aENvbnRleHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqbmFtZSwKIAkJCSB4bWxYUGF0aE9iamVjdFB0ciB2YWx1ZSkgewogICAgIHJldHVybih4bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVOUyhjdHh0LCBuYW1lLCBOVUxMLCB2YWx1ZSkpOwpAQCAtNDg4NSw3ICs0OTAyLDcgQEAKICAgICBpZiAoY3R4dC0+dmFySGFzaCA9PSBOVUxMKQogCXJldHVybigtMSk7CiAgICAgaWYgKHZhbHVlID09IE5VTEwpCi0gICAgICAgIHJldHVybih4bWxIYXNoUmVtb3ZlRW50cnkyKGN0eHQtPnZhckhhc2gsIG5hbWUsIG5zX3VyaSwgCisgICAgICAgIHJldHVybih4bWxIYXNoUmVtb3ZlRW50cnkyKGN0eHQtPnZhckhhc2gsIG5hbWUsIG5zX3VyaSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAoeG1sSGFzaERlYWxsb2NhdG9yKXhtbFhQYXRoRnJlZU9iamVjdCkpOwogICAgIHJldHVybih4bWxIYXNoVXBkYXRlRW50cnkyKGN0eHQtPnZhckhhc2gsIG5hbWUsIG5zX3VyaSwKIAkJCSAgICAgICAodm9pZCAqKSB2YWx1ZSwKQEAgLTQ5NDEsNyArNDk1OCw3IEBACiAgKiBAbnNfdXJpOiAgdGhlIHZhcmlhYmxlIG5hbWVzcGFjZSBVUkkKICAqCiAgKiBTZWFyY2ggaW4gdGhlIFZhcmlhYmxlIGFycmF5IG9mIHRoZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4KLSAqIHZhcmlhYmxlIHZhbHVlLiAKKyAqIHZhcmlhYmxlIHZhbHVlLgogICoKICAqIFJldHVybnMgdGhlIGEgY29weSBvZiB0aGUgdmFsdWUgb3IgTlVMTCBpZiBub3QgZm91bmQKICAqLwpAQCAtNTMyNCw3ICs1MzQxLDcgQEAKICNlbmRpZgogICAgICAgICBjYXNlIFhQQVRIX1VTRVJTOgogCSAgICByZXQtPnVzZXIgPSB2YWwtPnVzZXI7Ci0JICAgIGJyZWFrOyAKKwkgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgWFBBVEhfVU5ERUZJTkVEOgogCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJICAgICJ4bWxYUGF0aE9iamVjdENvcHk6IHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCkBAIC01MzUzLDcgKzUzNzAsNyBAQAogI2VuZGlmCiAJICAgIG9iai0+dHlwZSA9IFhQQVRIX1hTTFRfVFJFRTsgLyogVE9ETzogSnVzdCBmb3IgZGVidWdnaW5nLiAqLwogCSAgICBpZiAob2JqLT5ub2Rlc2V0dmFsICE9IE5VTEwpCi0JCXhtbFhQYXRoRnJlZVZhbHVlVHJlZShvYmotPm5vZGVzZXR2YWwpOwkKKwkJeG1sWFBhdGhGcmVlVmFsdWVUcmVlKG9iai0+bm9kZXNldHZhbCk7CiAJfSBlbHNlIHsKIAkgICAgaWYgKG9iai0+bm9kZXNldHZhbCAhPSBOVUxMKQogCQl4bWxYUGF0aEZyZWVOb2RlU2V0KG9iai0+bm9kZXNldHZhbCk7CkBAIC01MzcwLDcgKzUzODcsNyBAQAogI2lmZGVmIFhQX0RFQlVHX09CSl9VU0FHRQogICAgIHhtbFhQYXRoRGVidWdPYmpVc2FnZVJlbGVhc2VkKE5VTEwsIG9iai0+dHlwZSk7CiAjZW5kaWYKLSAgICB4bWxGcmVlKG9iaik7ICAgICAgICAKKyAgICB4bWxGcmVlKG9iaik7CiB9CiAKIC8qKgpAQCAtNTM5Myw3ICs1NDEwLDcgQEAKIAlyZXR1cm47CiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5jYWNoZSA9PSBOVUxMKSkgewogCSB4bWxYUGF0aEZyZWVPYmplY3Qob2JqKTsKLSAgICB9IGVsc2UgeyAgICAgICAKKyAgICB9IGVsc2UgewogCXhtbFhQYXRoQ29udGV4dENhY2hlUHRyIGNhY2hlID0KIAkgICAgKHhtbFhQYXRoQ29udGV4dENhY2hlUHRyKSBjdHh0LT5jYWNoZTsKIApAQCAtNTQwMiw3ICs1NDE5LDcgQEAKIAkgICAgY2FzZSBYUEFUSF9YU0xUX1RSRUU6CiAJCWlmIChvYmotPm5vZGVzZXR2YWwgIT0gTlVMTCkgewogCQkgICAgaWYgKG9iai0+Ym9vbHZhbCkgewotCQkgICAgCS8qCisJCQkvKgogCQkJKiBJdCBsb29rcyBsaWtlIHRoZSBAYm9vbHZhbCBpcyB1c2VkIGZvcgogCQkJKiBldmFsdWF0aW9uIGlmIHRoaXMgYW4gWFNMVCBSZXN1bHQgVHJlZSBGcmFnbWVudC4KIAkJCSogVE9ETzogQ2hlY2sgaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGNvcnJlY3QuCkBAIC01NDQ5LDcgKzU0NjYsNyBAQAogCQkgICAgeG1sWFB0ckZyZWVMb2NhdGlvblNldChvYmotPnVzZXIpOwogCQl9CiAJCWdvdG8gZnJlZV9vYmo7Ci0jZW5kaWYJICAgIAorI2VuZGlmCiAJICAgIGRlZmF1bHQ6CiAJCWdvdG8gZnJlZV9vYmo7CiAJfQpAQCAtNTQ3MCw3ICs1NDg3LDcgQEAKIAogCWlmIChvYmotPm5vZGVzZXR2YWwgIT0gTlVMTCkgewogCSAgICB4bWxOb2RlU2V0UHRyIHRtcHNldCA9IG9iai0+bm9kZXNldHZhbDsKLQkgICAgCisKIAkgICAgLyoKIAkgICAgKiBUT0RPOiBEdWUgdG8gdGhvc2UgbmFzdHkgbnMtbm9kZXMsIHdlIG5lZWQgdG8gdHJhdmVyc2UKIAkgICAgKiAgdGhlIGxpc3QgYW5kIGZyZWUgdGhlIG5zLW5vZGVzLgpAQCAtNTQ5Myw3ICs1NTEwLDcgQEAKIAkJaWYgKCh0bXBzZXQtPm5vZGVUYWJbMF0gIT0gTlVMTCkgJiYKIAkJICAgICh0bXBzZXQtPm5vZGVUYWJbMF0tPnR5cGUgPT0gWE1MX05BTUVTUEFDRV9ERUNMKSkKIAkJICAgIHhtbFhQYXRoTm9kZVNldEZyZWVOcygoeG1sTnNQdHIpIHRtcHNldC0+bm9kZVRhYlswXSk7Ci0JICAgIH0JCQorCSAgICB9CiAJICAgIHRtcHNldC0+bm9kZU5yID0gMDsKIAkgICAgbWVtc2V0KG9iaiwgMCwgc2l6ZW9mKHhtbFhQYXRoT2JqZWN0KSk7CiAJICAgIG9iai0+bm9kZXNldHZhbCA9IHRtcHNldDsKQEAgLTU1MDUsNyArNTUyMiw3IEBACiBmcmVlX29iajoKIAkvKgogCSogQ2FjaGUgaXMgZnVsbDsgZnJlZSB0aGUgb2JqZWN0LgotCSovICAgIAorCSovCiAJaWYgKG9iai0+bm9kZXNldHZhbCAhPSBOVUxMKQogCSAgICB4bWxYUGF0aEZyZWVOb2RlU2V0KG9iai0+bm9kZXNldHZhbCk7CiAjaWZkZWYgWFBfREVCVUdfT0JKX1VTQUdFCkBAIC01NjE2LDcgKzU2MzMsNyBAQAogICogQ29udmVydHMgYW4gZXhpc3Rpbmcgb2JqZWN0IHRvIGl0cyBzdHJpbmcoKSBlcXVpdmFsZW50CiAgKgogICogUmV0dXJucyB0aGUgYWxsb2NhdGVkIHN0cmluZyB2YWx1ZSBvZiB0aGUgb2JqZWN0LCBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0gKiAgICAgICAgIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIHRoZSBzdHJpbmcgbWVtb3J5IHdpdGggeG1sRnJlZSgpLiAKKyAqICAgICAgICAgSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgdGhlIHN0cmluZyBtZW1vcnkgd2l0aCB4bWxGcmVlKCkuCiAgKi8KIHhtbENoYXIgKgogeG1sWFBhdGhDYXN0VG9TdHJpbmcoeG1sWFBhdGhPYmplY3RQdHIgdmFsKSB7CkBAIC02MDA3LDcgKzYwMjQsNyBAQAogICAgIH0KICNlbmRpZgogCi0gICAgeG1sWFBhdGhSZWdpc3RlckFsbEZ1bmN0aW9ucyhyZXQpOyAgIAorICAgIHhtbFhQYXRoUmVnaXN0ZXJBbGxGdW5jdGlvbnMocmV0KTsKIAogICAgIHJldHVybihyZXQpOwogfQpAQCAtNjAzOCw3ICs2MDU1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgQ0hFQ0tfQ1RYVChjdHh0KQkJCQkJCVwKLSAgICBpZiAoY3R4dCA9PSBOVUxMKSB7IAkJCQkJCVwKKyAgICBpZiAoY3R4dCA9PSBOVUxMKSB7CQkJCQkJXAogCV9feG1sUmFpc2VFcnJvcihOVUxMLCBOVUxMLCBOVUxMLAkJCQlcCiAJCU5VTEwsIE5VTEwsIFhNTF9GUk9NX1hQQVRILAkJCQlcCiAJCVhNTF9FUlJfSU5URVJOQUxfRVJST1IsIFhNTF9FUlJfRkFUQUwsCQkJXApAQCAtNjA0OSw3ICs2MDY2LDcgQEAKICAgICB9CQkJCQkJCQkJXAogCiAjZGVmaW5lIENIRUNLX0NUWFRfTkVHKGN0eHQpCQkJCQkJXAotICAgIGlmIChjdHh0ID09IE5VTEwpIHsgCQkJCQkJXAorICAgIGlmIChjdHh0ID09IE5VTEwpIHsJCQkJCQlcCiAJX194bWxSYWlzZUVycm9yKE5VTEwsIE5VTEwsIE5VTEwsCQkJCVwKIAkJTlVMTCwgTlVMTCwgWE1MX0ZST01fWFBBVEgsCQkJCVwKIAkJWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwgWE1MX0VSUl9GQVRBTCwJCQlcCkBAIC02MDYyLDcgKzYwNzksNyBAQAogCiAjZGVmaW5lIENIRUNLX0NPTlRFWFQoY3R4dCkJCQkJCQlcCiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5kb2MgPT0gTlVMTCkgfHwJCQlcCi0gICAgICAgIChjdHh0LT5kb2MtPmNoaWxkcmVuID09IE5VTEwpKSB7IAkJCQlcCisgICAgICAgIChjdHh0LT5kb2MtPmNoaWxkcmVuID09IE5VTEwpKSB7CQkJCVwKIAl4bWxYUGF0aGVycm9yKGN0eHQsIF9fRklMRV9fLCBfX0xJTkVfXywgWFBBVEhfSU5WQUxJRF9DVFhUKTsJXAogCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgIH0KQEAgLTYxMjUsNyArNjE0Miw3IEBACiAgICAgbWVtc2V0KHJldCwgMCAsIChzaXplX3QpIHNpemVvZih4bWxYUGF0aFBhcnNlckNvbnRleHQpKTsKIAogICAgIC8qIEFsbG9jYXRlIHRoZSB2YWx1ZSBzdGFjayAqLwotICAgIHJldC0+dmFsdWVUYWIgPSAoeG1sWFBhdGhPYmplY3RQdHIgKikgCisgICAgcmV0LT52YWx1ZVRhYiA9ICh4bWxYUGF0aE9iamVjdFB0ciAqKQogICAgICAgICAgICAgICAgICAgICAgeG1sTWFsbG9jKDEwICogc2l6ZW9mKHhtbFhQYXRoT2JqZWN0UHRyKSk7CiAgICAgaWYgKHJldC0+dmFsdWVUYWIgPT0gTlVMTCkgewogCXhtbEZyZWUocmV0KTsKQEAgLTYyNzIsNyArNjI4OSw3IEBACiAJICAgIHRtcCA9IHRtcC0+bmV4dDsKIAkgICAgY29udGludWU7CiAJfQotCQorCiAJZG8gewogCSAgICB0bXAgPSB0bXAtPnBhcmVudDsKIAkgICAgaWYgKHRtcCA9PSBOVUxMKQpAQCAtNjQzMSw3ICs2NDQ4LDcgQEAKICAqIElmIGJvdGggb2JqZWN0cyB0byBiZSBjb21wYXJlZCBhcmUgbm9kZS1zZXRzLCB0aGVuIHRoZSBjb21wYXJpc29uCiAgKiB3aWxsIGJlIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub2RlIGluIHRoZSBmaXJzdCBub2RlLXNldAogICogYW5kIGEgbm9kZSBpbiB0aGUgc2Vjb25kIG5vZGUtc2V0IHN1Y2ggdGhhdCB0aGUgcmVzdWx0IG9mIHBlcmZvcm1pbmcKLSAqIHRoZSBjb21wYXJpc29uIG9uIHRoZSBzdHJpbmctdmFsdWVzIG9mIHRoZSB0d28gbm9kZXMgaXMgdHJ1ZS4gCisgKiB0aGUgY29tcGFyaXNvbiBvbiB0aGUgc3RyaW5nLXZhbHVlcyBvZiB0aGUgdHdvIG5vZGVzIGlzIHRydWUuCiAgKiAuLi4uCiAgKiBXaGVuIG5laXRoZXIgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGlzIGEgbm9kZS1zZXQgYW5kIHRoZSBvcGVyYXRvcgogICogaXMgPD0sIDwsID49IG9yID4sIHRoZW4gdGhlIG9iamVjdHMgYXJlIGNvbXBhcmVkIGJ5IGNvbnZlcnRpbmcgYm90aApAQCAtNjQ0NSw3ICs2NDYyLDcgQEAKICAqICAgIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmc7IGFueSBvdGhlciBzdHJpbmcgaXMgY29udmVydGVkIHRvIE5hTgogICoKICAqIENvbmNsdXNpb24gYWxsIG5vZGVzIG5lZWQgdG8gYmUgY29udmVydGVkIGZpcnN0IHRvIHRoZWlyIHN0cmluZyB2YWx1ZQotICogYW5kIHRoZW4gdGhlIGNvbXBhcmlzb24gbXVzdCBiZSBkb25lIHdoZW4gcG9zc2libGUgCisgKiBhbmQgdGhlbiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIGRvbmUgd2hlbiBwb3NzaWJsZQogICovCiBzdGF0aWMgaW50CiB4bWxYUGF0aENvbXBhcmVOb2RlU2V0cyhpbnQgaW5mLCBpbnQgc3RyaWN0LApAQCAtNjUwMCw3ICs2NTE3LDcgQEAKIAkgICAgfQogCSAgICBpZiAoeG1sWFBhdGhJc05hTih2YWx1ZXMyW2pdKSkKIAkJY29udGludWU7Ci0JICAgIGlmIChpbmYgJiYgc3RyaWN0KSAKKwkgICAgaWYgKGluZiAmJiBzdHJpY3QpCiAJCXJldCA9ICh2YWwxIDwgdmFsdWVzMltqXSk7CiAJICAgIGVsc2UgaWYgKGluZiAmJiAhc3RyaWN0KQogCQlyZXQgPSAodmFsMSA8PSB2YWx1ZXMyW2pdKTsKQEAgLTY4NDAsNyArNjg1Nyw3IEBACiAJCWNhc2UgWFBBVEhfU1RSSU5HOgogCQkgICAgaWYgKChhcmcyLT5zdHJpbmd2YWwgPT0gTlVMTCkgfHwKIAkJCShhcmcyLT5zdHJpbmd2YWxbMF0gPT0gMCkpIHJldCA9IDA7Ci0JCSAgICBlbHNlIAorCQkgICAgZWxzZQogCQkJcmV0ID0gMTsKIAkJICAgIHJldCA9IChhcmcxLT5ib29sdmFsID09IHJldCk7CiAJCSAgICBicmVhazsKQEAgLTY4NzUsNyArNjg5Miw3IEBACiAJCWNhc2UgWFBBVEhfTlVNQkVSOgogCQkgICAgLyogSGFuZCBjaGVjayBOYU4gYW5kIEluZmluaXR5IGVxdWFsaXRpZXMgKi8KIAkJICAgIGlmICh4bWxYUGF0aElzTmFOKGFyZzEtPmZsb2F0dmFsKSB8fAotCQkgICAgCSAgICB4bWxYUGF0aElzTmFOKGFyZzItPmZsb2F0dmFsKSkgeworCQkJICAgIHhtbFhQYXRoSXNOYU4oYXJnMi0+ZmxvYXR2YWwpKSB7CiAJCSAgICAgICAgcmV0ID0gMDsKIAkJICAgIH0gZWxzZSBpZiAoeG1sWFBhdGhJc0luZihhcmcxLT5mbG9hdHZhbCkgPT0gMSkgewogCQkgICAgICAgIGlmICh4bWxYUGF0aElzSW5mKGFyZzItPmZsb2F0dmFsKSA9PSAxKQpAQCAtNjkyMyw3ICs2OTQwLDcgQEAKIAkJY2FzZSBYUEFUSF9CT09MRUFOOgogCQkgICAgaWYgKChhcmcxLT5zdHJpbmd2YWwgPT0gTlVMTCkgfHwKIAkJCShhcmcxLT5zdHJpbmd2YWxbMF0gPT0gMCkpIHJldCA9IDA7Ci0JCSAgICBlbHNlIAorCQkgICAgZWxzZQogCQkJcmV0ID0gMTsKIAkJICAgIHJldCA9IChhcmcyLT5ib29sdmFsID09IHJldCk7CiAJCSAgICBicmVhazsKQEAgLTY5MzYsNyArNjk1Myw3IEBACiAJCSAgICBhcmcxID0gdmFsdWVQb3AoY3R4dCk7CiAJCSAgICAvKiBIYW5kIGNoZWNrIE5hTiBhbmQgSW5maW5pdHkgZXF1YWxpdGllcyAqLwogCQkgICAgaWYgKHhtbFhQYXRoSXNOYU4oYXJnMS0+ZmxvYXR2YWwpIHx8Ci0JCSAgICAJICAgIHhtbFhQYXRoSXNOYU4oYXJnMi0+ZmxvYXR2YWwpKSB7CisJCQkgICAgeG1sWFBhdGhJc05hTihhcmcyLT5mbG9hdHZhbCkpIHsKIAkJICAgICAgICByZXQgPSAwOwogCQkgICAgfSBlbHNlIGlmICh4bWxYUGF0aElzSW5mKGFyZzEtPmZsb2F0dmFsKSA9PSAxKSB7CiAJCQlpZiAoeG1sWFBhdGhJc0luZihhcmcyLT5mbG9hdHZhbCkgPT0gMSkKQEAgLTcwMDIsNyArNzAxOSw3IEBACiAgICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKGN0eHQtPmNvbnRleHQgPT0gTlVMTCkpIHJldHVybigwKTsKLSAgICBhcmcyID0gdmFsdWVQb3AoY3R4dCk7IAorICAgIGFyZzIgPSB2YWx1ZVBvcChjdHh0KTsKICAgICBhcmcxID0gdmFsdWVQb3AoY3R4dCk7CiAgICAgaWYgKChhcmcxID09IE5VTEwpIHx8IChhcmcyID09IE5VTEwpKSB7CiAJaWYgKGFyZzEgIT0gTlVMTCkKQEAgLTcwNDgsNyArNzA2NSw3IEBACiAJICAgIGNhc2UgWFBBVEhfQk9PTEVBTjoKIAkJaWYgKChhcmcxLT5ub2Rlc2V0dmFsID09IE5VTEwpIHx8CiAJCSAgKGFyZzEtPm5vZGVzZXR2YWwtPm5vZGVOciA9PSAwKSkgcmV0ID0gMDsKLQkJZWxzZSAKKwkJZWxzZQogCQkgICAgcmV0ID0gMTsKIAkJcmV0ID0gKHJldCA9PSBhcmcyLT5ib29sdmFsKTsKIAkJYnJlYWs7CkBAIC03MDg3LDcgKzcxMDQsNyBAQAogICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5jb250ZXh0ID09IE5VTEwpKSByZXR1cm4oMCk7Ci0gICAgYXJnMiA9IHZhbHVlUG9wKGN0eHQpOyAKKyAgICBhcmcyID0gdmFsdWVQb3AoY3R4dCk7CiAgICAgYXJnMSA9IHZhbHVlUG9wKGN0eHQpOwogICAgIGlmICgoYXJnMSA9PSBOVUxMKSB8fCAoYXJnMiA9PSBOVUxMKSkgewogCWlmIChhcmcxICE9IE5VTEwpCkBAIC03MTMzLDcgKzcxNTAsNyBAQAogCSAgICBjYXNlIFhQQVRIX0JPT0xFQU46CiAJCWlmICgoYXJnMS0+bm9kZXNldHZhbCA9PSBOVUxMKSB8fAogCQkgIChhcmcxLT5ub2Rlc2V0dmFsLT5ub2RlTnIgPT0gMCkpIHJldCA9IDA7Ci0JCWVsc2UgCisJCWVsc2UKIAkJICAgIHJldCA9IDE7CiAJCXJldCA9IChyZXQgIT0gYXJnMi0+Ym9vbHZhbCk7CiAJCWJyZWFrOwpAQCAtNzE2NCw3ICs3MTgxLDcgQEAKICAqIEBpbmY6ICBsZXNzIHRoYW4gKDEpIG9yIGdyZWF0ZXIgdGhhbiAoMCkKICAqIEBzdHJpY3Q6ICBpcyB0aGUgY29tcGFyaXNvbiBzdHJpY3QKICAqCi0gKiBJbXBsZW1lbnQgdGhlIGNvbXBhcmUgb3BlcmF0aW9uIG9uIFhQYXRoIG9iamVjdHM6IAorICogSW1wbGVtZW50IHRoZSBjb21wYXJlIG9wZXJhdGlvbiBvbiBYUGF0aCBvYmplY3RzOgogICogICAgIEBhcmcxIDwgQGFyZzIgICAgKDEsIDEsIC4uLgogICogICAgIEBhcmcxIDw9IEBhcmcyICAgKDEsIDAsIC4uLgogICogICAgIEBhcmcxID4gQGFyZzIgICAgKDAsIDEsIC4uLgpAQCAtNzE4OCw3ICs3MjA1LDcgQEAKICAgICB4bWxYUGF0aE9iamVjdFB0ciBhcmcxLCBhcmcyOwogCiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5jb250ZXh0ID09IE5VTEwpKSByZXR1cm4oMCk7Ci0gICAgYXJnMiA9IHZhbHVlUG9wKGN0eHQpOyAKKyAgICBhcmcyID0gdmFsdWVQb3AoY3R4dCk7CiAgICAgYXJnMSA9IHZhbHVlUG9wKGN0eHQpOwogICAgIGlmICgoYXJnMSA9PSBOVUxMKSB8fCAoYXJnMiA9PSBOVUxMKSkgewogCWlmIChhcmcxICE9IE5VTEwpCkBAIC03NDI5LDcgKzc0NDYsNyBAQAogCSAgICBjdHh0LT52YWx1ZS0+ZmxvYXR2YWwgPSB4bWxYUGF0aFBJTkY7CiAJZWxzZSBpZiAoY3R4dC0+dmFsdWUtPmZsb2F0dmFsIDwgMCkKIAkgICAgY3R4dC0+dmFsdWUtPmZsb2F0dmFsID0geG1sWFBhdGhOSU5GOwotICAgIH0gZWxzZSAKKyAgICB9IGVsc2UKIAljdHh0LT52YWx1ZS0+ZmxvYXR2YWwgLz0gdmFsOwogfQogCkBAIC03NjY0LDEwICs3NjgxLDEwIEBACiAjaWZkZWYgTElCWE1MX0RPQ0JfRU5BQkxFRAogCSAgICBjYXNlIFhNTF9ET0NCX0RPQ1VNRU5UX05PREU6CiAjZW5kaWYKLQkgICAgY2FzZSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFOgkgICAgCQorCSAgICBjYXNlIFhNTF9IVE1MX0RPQ1VNRU5UX05PREU6CSAgICAKIAkJcmV0dXJuKGNvbnRleHROb2RlKTsKIAkgICAgZGVmYXVsdDoKLQkJcmV0dXJuKE5VTEwpOwkgICAgCisJCXJldHVybihOVUxMKTsKIAl9CiAJcmV0dXJuKE5VTEwpOwogICAgIH0gZWxzZSB7CkBAIC03Njc4LDcgKzc2OTUsNyBAQAogCQljYXNlIFhNTF9FTEVNRU5UX05PREU6CiAJCS8qIFRPRE86IE9LIHRvIGhhdmUgWEluY2x1ZGUgaGVyZT8gKi8KIAkJY2FzZSBYTUxfWElOQ0xVREVfU1RBUlQ6Ci0JCWNhc2UgWE1MX0RPQ1VNRU5UX0ZSQUdfTk9ERToJCQorCQljYXNlIFhNTF9ET0NVTUVOVF9GUkFHX05PREU6CiAJCSAgICBpZiAoY3VyICE9IHN0YXJ0KQogCQkJcmV0dXJuKGN1cik7CiAJCSAgICBpZiAoY3VyLT5jaGlsZHJlbiAhPSBOVUxMKSB7CkBAIC03Njk3LDEzICs3NzE0LDEzIEBACiAJCSAgICByZXR1cm4oeG1sRG9jR2V0Um9vdEVsZW1lbnQoKHhtbERvY1B0cikgY3VyKSk7CiAJCWRlZmF1bHQ6CiAJCSAgICBicmVhazsKLQkgICAgfQkgICAgCi0JICAgIAorCSAgICB9CisKIG5leHRfc2libGluZzoKIAkgICAgaWYgKChjdXIgPT0gTlVMTCkgfHwgKGN1ciA9PSBjb250ZXh0Tm9kZSkpCi0JCXJldHVybihOVUxMKTsJCisJCXJldHVybihOVUxMKTsKIAkgICAgaWYgKGN1ci0+bmV4dCAhPSBOVUxMKSB7Ci0JCWN1ciA9IGN1ci0+bmV4dDsJCQorCQljdXIgPSBjdXItPm5leHQ7CiAJICAgIH0gZWxzZSB7CiAJCWN1ciA9IGN1ci0+cGFyZW50OwogCQlnb3RvIG5leHRfc2libGluZzsKQEAgLTc3MTEsNyArNzcyOCw3IEBACiAJfQogICAgIH0KICAgICByZXR1cm4oTlVMTCk7Ci19ICAgICAgICAgICAgCit9CiAKIC8qKgogICogeG1sWFBhdGhOZXh0RGVzY2VuZGFudDoKQEAgLTc3NDMsNyArNzc2MCw3IEBACiAJLyoKIAkgKiBEbyBub3QgZGVzY2VuZCBvbiBlbnRpdGllcyBkZWNsYXJhdGlvbnMKIAkgKi8KLSAgICAJaWYgKGN1ci0+Y2hpbGRyZW4tPnR5cGUgIT0gWE1MX0VOVElUWV9ERUNMKSB7CisJaWYgKGN1ci0+Y2hpbGRyZW4tPnR5cGUgIT0gWE1MX0VOVElUWV9ERUNMKSB7CiAJICAgIGN1ciA9IGN1ci0+Y2hpbGRyZW47CiAJICAgIC8qCiAJICAgICAqIFNraXAgRFREcwpAQCAtNzc2MSw3ICs3Nzc4LDcgQEAKIAkgICAgKGN1ci0+dHlwZSAhPSBYTUxfRFREX05PREUpKQogCSAgICByZXR1cm4oY3VyKTsKICAgICB9Ci0gICAgCisKICAgICBkbyB7CiAgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50OwogCWlmIChjdXIgPT0gTlVMTCkgYnJlYWs7CkBAIC03ODYwLDcgKzc4NzcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKIAkgICAgY2FzZSBYTUxfTkFNRVNQQUNFX0RFQ0w6IHsKIAkJeG1sTnNQdHIgbnMgPSAoeG1sTnNQdHIpIGN0eHQtPmNvbnRleHQtPm5vZGU7Ci0JCQorCiAJCWlmICgobnMtPm5leHQgIT0gTlVMTCkgJiYKIAkJICAgIChucy0+bmV4dC0+dHlwZSAhPSBYTUxfTkFNRVNQQUNFX0RFQ0wpKQogCQkgICAgcmV0dXJuKCh4bWxOb2RlUHRyKSBucy0+bmV4dCk7CkBAIC03OTMzLDcgKzc5NTAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKIAkgICAgY2FzZSBYTUxfTkFNRVNQQUNFX0RFQ0w6IHsKIAkJeG1sTnNQdHIgbnMgPSAoeG1sTnNQdHIpIGN0eHQtPmNvbnRleHQtPm5vZGU7Ci0JCQorCiAJCWlmICgobnMtPm5leHQgIT0gTlVMTCkgJiYKIAkJICAgIChucy0+bmV4dC0+dHlwZSAhPSBYTUxfTkFNRVNQQUNFX0RFQ0wpKQogCQkgICAgcmV0dXJuKCh4bWxOb2RlUHRyKSBucy0+bmV4dCk7CkBAIC03OTc3LDcgKzc5OTQsNyBAQAogCX0KIAljYXNlIFhNTF9OQU1FU1BBQ0VfREVDTDogewogCSAgICB4bWxOc1B0ciBucyA9ICh4bWxOc1B0cikgY3R4dC0+Y29udGV4dC0+bm9kZTsKLQkJCisKIAkgICAgaWYgKChucy0+bmV4dCAhPSBOVUxMKSAmJgogCSAgICAgICAgKG5zLT5uZXh0LT50eXBlICE9IFhNTF9OQU1FU1BBQ0VfREVDTCkpCiAJICAgICAgICByZXR1cm4oKHhtbE5vZGVQdHIpIG5zLT5uZXh0KTsKQEAgLTgxNzQsNyArODE5MSw3IEBACiAgKiBub2RlIHRoYXQgYXJlIGJlZm9yZSB0aGUgY29udGV4dCBub2RlIGluIGRvY3VtZW50IG9yZGVyLCBleGNsdWRpbmcgYW55CiAgKiBhbmNlc3RvcnMgYW5kIGV4Y2x1ZGluZyBhdHRyaWJ1dGUgbm9kZXMgYW5kIG5hbWVzcGFjZSBub2RlczsgdGhlIG5vZGVzIGFyZQogICogb3JkZXJlZCBpbiByZXZlcnNlIGRvY3VtZW50IG9yZGVyCi0gKiBUaGlzIGlzIGEgZmFzdGVyIGltcGxlbWVudGF0aW9uIGJ1dCBpbnRlcm5hbCBvbmx5IHNpbmNlIGl0IHJlcXVpcmVzIGEgCisgKiBUaGlzIGlzIGEgZmFzdGVyIGltcGxlbWVudGF0aW9uIGJ1dCBpbnRlcm5hbCBvbmx5IHNpbmNlIGl0IHJlcXVpcmVzIGEKICAqIHN0YXRlIGtlcHQgaW4gdGhlIHBhcnNlciBjb250ZXh0OiBjdHh0LT5hbmNlc3Rvci4KICAqCiAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgZm9sbG93aW5nIHRoYXQgYXhpcwpAQCAtODIzMSw3ICs4MjQ4LDcgQEAKICAgICBpZiAoY3R4dC0+Y29udGV4dC0+dG1wTnNMaXN0ID09IE5VTEwgJiYgY3VyICE9ICh4bWxOb2RlUHRyKSB4bWxYUGF0aFhNTE5hbWVzcGFjZSkgewogICAgICAgICBpZiAoY3R4dC0+Y29udGV4dC0+dG1wTnNMaXN0ICE9IE5VTEwpCiAJICAgIHhtbEZyZWUoY3R4dC0+Y29udGV4dC0+dG1wTnNMaXN0KTsKLQljdHh0LT5jb250ZXh0LT50bXBOc0xpc3QgPSAKKwljdHh0LT5jb250ZXh0LT50bXBOc0xpc3QgPQogCSAgICB4bWxHZXROc0xpc3QoY3R4dC0+Y29udGV4dC0+ZG9jLCBjdHh0LT5jb250ZXh0LT5ub2RlKTsKIAljdHh0LT5jb250ZXh0LT50bXBOc05yID0gMDsKIAlpZiAoY3R4dC0+Y29udGV4dC0+dG1wTnNMaXN0ICE9IE5VTEwpIHsKQEAgLTgzNzksNyArODM5Niw3IEBACiAgICAgeG1sWFBhdGhPYmplY3RQdHIgY3VyOwogCiAgICAgQ0hFQ0tfQVJJVFkoMSk7Ci0gICAgaWYgKChjdHh0LT52YWx1ZSA9PSBOVUxMKSB8fCAKKyAgICBpZiAoKGN0eHQtPnZhbHVlID09IE5VTEwpIHx8CiAJKChjdHh0LT52YWx1ZS0+dHlwZSAhPSBYUEFUSF9OT0RFU0VUKSAmJgogCSAoY3R4dC0+dmFsdWUtPnR5cGUgIT0gWFBBVEhfWFNMVF9UUkVFKSkpCiAJWFBfRVJST1IoWFBBVEhfSU5WQUxJRF9UWVBFKTsKQEAgLTg0MzIsNiArODQ0OSw4IEBACiAgICAgaWYgKGlkcyA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAKICAgICByZXQgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4ocmV0KTsKIAogICAgIHdoaWxlIChJU19CTEFOS19DSCgqY3VyKSkgY3VyKys7CiAgICAgd2hpbGUgKCpjdXIgIT0gMCkgewpAQCAtODQ5OSw2ICs4NTE4LDExIEBACiAJaW50IGk7CiAKIAlyZXQgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7CisgICAgICAgIC8qCisgICAgICAgICAqIEZJWE1FIC0tIGluIGFuIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uIHRoaXMgd2lsbCBiZWhhdmUgYmFkbHkuCisgICAgICAgICAqIFRoZSBzb2x1dGlvbiBpcyBub3QgY2xlYXIgLS0gd2UgYWxyZWFkeSBwb3BwZWQgYW4gaXRlbSBmcm9tCisgICAgICAgICAqIGN0eHQsIHNvIHRoZSBvYmplY3QgaXMgaW4gYSBjb3JydXB0IHN0YXRlLgorICAgICAgICAgKi8KIAogCWlmIChvYmotPm5vZGVzZXR2YWwgIT0gTlVMTCkgewogCSAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLT5ub2Rlc2V0dmFsLT5ub2RlTnI7IGkrKykgewpAQCAtODUxNyw3ICs4NTQxLDcgQEAKICAgICB9CiAgICAgb2JqID0geG1sWFBhdGhDYWNoZUNvbnZlcnRTdHJpbmcoY3R4dC0+Y29udGV4dCwgb2JqKTsKICAgICByZXQgPSB4bWxYUGF0aEdldEVsZW1lbnRzQnlJZHMoY3R4dC0+Y29udGV4dC0+ZG9jLCBvYmotPnN0cmluZ3ZhbCk7Ci0gICAgdmFsdWVQdXNoKGN0eHQsIHhtbFhQYXRoQ2FjaGVXcmFwTm9kZVNldChjdHh0LT5jb250ZXh0LCByZXQpKTsgICAgCisgICAgdmFsdWVQdXNoKGN0eHQsIHhtbFhQYXRoQ2FjaGVXcmFwTm9kZVNldChjdHh0LT5jb250ZXh0LCByZXQpKTsKICAgICB4bWxYUGF0aFJlbGVhc2VPYmplY3QoY3R4dC0+Y29udGV4dCwgb2JqKTsKICAgICByZXR1cm47CiB9CkBAIC04NTQ4LDcgKzg1NzIsNyBAQAogICAgIH0KIAogICAgIENIRUNLX0FSSVRZKDEpOwotICAgIGlmICgoY3R4dC0+dmFsdWUgPT0gTlVMTCkgfHwgCisgICAgaWYgKChjdHh0LT52YWx1ZSA9PSBOVUxMKSB8fAogCSgoY3R4dC0+dmFsdWUtPnR5cGUgIT0gWFBBVEhfTk9ERVNFVCkgJiYKIAkgKGN0eHQtPnZhbHVlLT50eXBlICE9IFhQQVRIX1hTTFRfVFJFRSkpKQogCVhQX0VSUk9SKFhQQVRIX0lOVkFMSURfVFlQRSk7CkBAIC04NjA2LDcgKzg2MzAsNyBAQAogCW5hcmdzID0gMTsKICAgICB9CiAgICAgQ0hFQ0tfQVJJVFkoMSk7Ci0gICAgaWYgKChjdHh0LT52YWx1ZSA9PSBOVUxMKSB8fCAKKyAgICBpZiAoKGN0eHQtPnZhbHVlID09IE5VTEwpIHx8CiAJKChjdHh0LT52YWx1ZS0+dHlwZSAhPSBYUEFUSF9OT0RFU0VUKSAmJgogCSAoY3R4dC0+dmFsdWUtPnR5cGUgIT0gWFBBVEhfWFNMVF9UUkVFKSkpCiAJWFBfRVJST1IoWFBBVEhfSU5WQUxJRF9UWVBFKTsKQEAgLTg2OTAsNyArODcxNCw3IEBACiAJCQkgICAgY3VyLT5ub2Rlc2V0dmFsLT5ub2RlVGFiW2ldLT5uYW1lKSk7CiAJCX0gZWxzZSB7CiAJCSAgICB4bWxDaGFyICpmdWxsbmFtZTsKLQkJICAgIAorCiAJCSAgICBmdWxsbmFtZSA9IHhtbEJ1aWxkUU5hbWUoY3VyLT5ub2Rlc2V0dmFsLT5ub2RlVGFiW2ldLT5uYW1lLAogCQkJCSAgICAgY3VyLT5ub2Rlc2V0dmFsLT5ub2RlVGFiW2ldLT5ucy0+cHJlZml4LAogCQkJCSAgICAgTlVMTCwgMCk7CkBAIC04NzI1LDExICs4NzQ5LDExIEBACiAgKiAgICAgIHRoZSBub2RlIGluIHRoZSBub2RlLXNldCB0aGF0IGlzIGZpcnN0IGluIGRvY3VtZW50IG9yZGVyLgogICogICAgICBJZiB0aGUgbm9kZS1zZXQgaXMgZW1wdHksIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICAqICAgIC0gQSBudW1iZXIgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGFzIGZvbGxvd3MKLSAqICAgICAgKyBOYU4gaXMgY29udmVydGVkIHRvIHRoZSBzdHJpbmcgTmFOIAotICogICAgICArIHBvc2l0aXZlIHplcm8gaXMgY29udmVydGVkIHRvIHRoZSBzdHJpbmcgMCAKLSAqICAgICAgKyBuZWdhdGl2ZSB6ZXJvIGlzIGNvbnZlcnRlZCB0byB0aGUgc3RyaW5nIDAgCi0gKiAgICAgICsgcG9zaXRpdmUgaW5maW5pdHkgaXMgY29udmVydGVkIHRvIHRoZSBzdHJpbmcgSW5maW5pdHkgCi0gKiAgICAgICsgbmVnYXRpdmUgaW5maW5pdHkgaXMgY29udmVydGVkIHRvIHRoZSBzdHJpbmcgLUluZmluaXR5IAorICogICAgICArIE5hTiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHN0cmluZyBOYU4KKyAqICAgICAgKyBwb3NpdGl2ZSB6ZXJvIGlzIGNvbnZlcnRlZCB0byB0aGUgc3RyaW5nIDAKKyAqICAgICAgKyBuZWdhdGl2ZSB6ZXJvIGlzIGNvbnZlcnRlZCB0byB0aGUgc3RyaW5nIDAKKyAqICAgICAgKyBwb3NpdGl2ZSBpbmZpbml0eSBpcyBjb252ZXJ0ZWQgdG8gdGhlIHN0cmluZyBJbmZpbml0eQorICogICAgICArIG5lZ2F0aXZlIGluZmluaXR5IGlzIGNvbnZlcnRlZCB0byB0aGUgc3RyaW5nIC1JbmZpbml0eQogICogICAgICArIGlmIHRoZSBudW1iZXIgaXMgYW4gaW50ZWdlciwgdGhlIG51bWJlciBpcyByZXByZXNlbnRlZCBpbgogICogICAgICAgIGRlY2ltYWwgZm9ybSBhcyBhIE51bWJlciB3aXRoIG5vIGRlY2ltYWwgcG9pbnQgYW5kIG5vIGxlYWRpbmcKICAqICAgICAgICB6ZXJvcywgcHJlY2VkZWQgYnkgYSBtaW51cyBzaWduICgtKSBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlCkBAIC04ODAzLDcgKzg4MjcsNyBAQAogICAgIENIRUNLX1RZUEUoWFBBVEhfU1RSSU5HKTsKICAgICBjdXIgPSB2YWx1ZVBvcChjdHh0KTsKICAgICB2YWx1ZVB1c2goY3R4dCwgeG1sWFBhdGhDYWNoZU5ld0Zsb2F0KGN0eHQtPmNvbnRleHQsCi0JeG1sVVRGOFN0cmxlbihjdXItPnN0cmluZ3ZhbCkpKTsgICAgCisJeG1sVVRGOFN0cmxlbihjdXItPnN0cmluZ3ZhbCkpKTsKICAgICB4bWxYUGF0aFJlbGVhc2VPYmplY3QoY3R4dC0+Y29udGV4dCwgY3VyKTsKIH0KIApAQCAtODk0MiwxMiArODk2NiwxMiBAQAogICogb3IgZXF1YWwgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBhbmQsIGlmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBzcGVjaWZpZWQsCiAgKiBsZXNzIHRoYW4gdGhlIHN1bSBvZiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHM7IHRoZSBjb21wYXJpc29ucwogICogYW5kIGFkZGl0aW9uIHVzZWQgZm9yIHRoZSBhYm92ZSBmb2xsb3cgdGhlIHN0YW5kYXJkIElFRUUgNzU0IHJ1bGVzLiBUaHVzOgotICogIC0gc3Vic3RyaW5nKCIxMjM0NSIsIDEuNSwgMi42KSByZXR1cm5zICIyMzQiIAotICogIC0gc3Vic3RyaW5nKCIxMjM0NSIsIDAsIDMpIHJldHVybnMgIjEyIiAKLSAqICAtIHN1YnN0cmluZygiMTIzNDUiLCAwIGRpdiAwLCAzKSByZXR1cm5zICIiIAotICogIC0gc3Vic3RyaW5nKCIxMjM0NSIsIDEsIDAgZGl2IDApIHJldHVybnMgIiIgCi0gKiAgLSBzdWJzdHJpbmcoIjEyMzQ1IiwgLTQyLCAxIGRpdiAwKSByZXR1cm5zICIxMjM0NSIgCi0gKiAgLSBzdWJzdHJpbmcoIjEyMzQ1IiwgLTEgZGl2IDAsIDEgZGl2IDApIHJldHVybnMgIiIgCisgKiAgLSBzdWJzdHJpbmcoIjEyMzQ1IiwgMS41LCAyLjYpIHJldHVybnMgIjIzNCIKKyAqICAtIHN1YnN0cmluZygiMTIzNDUiLCAwLCAzKSByZXR1cm5zICIxMiIKKyAqICAtIHN1YnN0cmluZygiMTIzNDUiLCAwIGRpdiAwLCAzKSByZXR1cm5zICIiCisgKiAgLSBzdWJzdHJpbmcoIjEyMzQ1IiwgMSwgMCBkaXYgMCkgcmV0dXJucyAiIgorICogIC0gc3Vic3RyaW5nKCIxMjM0NSIsIC00MiwgMSBkaXYgMCkgcmV0dXJucyAiMTIzNDUiCisgKiAgLSBzdWJzdHJpbmcoIjEyMzQ1IiwgLTEgZGl2IDAsIDEgZGl2IDApIHJldHVybnMgIiIKICAqLwogdm9pZAogeG1sWFBhdGhTdWJzdHJpbmdGdW5jdGlvbih4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dCwgaW50IG5hcmdzKSB7CkBAIC04OTg4LDE4ICs5MDEyLDE4IEBACiAgICAgKi8KICAgICBpZiAobmFyZ3MgIT0gMykgewogCWxlID0gKGRvdWJsZSltOwotCWlmIChpbiA8IDEuMCkgCisJaWYgKGluIDwgMS4wKQogCSAgICBpbiA9IDEuMDsKICAgICB9CiAKLSAgICAvKiBOZWVkIHRvIGNoZWNrIGZvciB0aGUgc3BlY2lhbCBjYXNlcyB3aGVyZSBlaXRoZXIgCisgICAgLyogTmVlZCB0byBjaGVjayBmb3IgdGhlIHNwZWNpYWwgY2FzZXMgd2hlcmUgZWl0aGVyCiAgICAgICogdGhlIGluZGV4IGlzIE5hTiwgdGhlIGxlbmd0aCBpcyBOYU4sIG9yIGJvdGgKICAgICAgKiBhcmd1bWVudHMgYXJlIGluZmluaXR5IChyZWx5aW5nIG9uIEluZiArIC1JbmYgPSBOYU4pCiAgICAgICovCiAgICAgaWYgKCF4bWxYUGF0aElzTmFOKGluICsgbGUpICYmICF4bWxYUGF0aElzSW5mKGluKSkgewogICAgICAgICAvKgogICAgICAgICAgKiBUbyBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHNwZWMsIHRoZSBhcmd1bWVudHMKLQkgKiBtdXN0IGJlIGNvbnZlcnRlZCB0byBpbnRlZ2VyIGZvcm1hdCBiZWZvcmUgCisJICogbXVzdCBiZSBjb252ZXJ0ZWQgdG8gaW50ZWdlciBmb3JtYXQgYmVmb3JlCiAJICogaW5pdGlhbCBpbmRleCBjYWxjdWxhdGlvbnMgYXJlIGRvbmUKICAgICAgICAgICoKICAgICAgICAgICogRmlyc3Qgd2UgZ28gdG8gaW50ZWdlciBmb3JtLCByb3VuZGluZyB1cApAQCAtOTA2NSwxMyArOTA4OSwxMyBAQAogICB4bWxCdWZmZXJQdHIgdGFyZ2V0OwogICBjb25zdCB4bWxDaGFyICpwb2ludDsKICAgaW50IG9mZnNldDsKLSAgCisKICAgQ0hFQ0tfQVJJVFkoMik7CiAgIENBU1RfVE9fU1RSSU5HOwogICBmaW5kID0gdmFsdWVQb3AoY3R4dCk7CiAgIENBU1RfVE9fU1RSSU5HOwogICBzdHIgPSB2YWx1ZVBvcChjdHh0KTsKLSAgCisKICAgdGFyZ2V0ID0geG1sQnVmZmVyQ3JlYXRlKCk7CiAgIGlmICh0YXJnZXQpIHsKICAgICBwb2ludCA9IHhtbFN0cnN0cihzdHItPnN0cmluZ3ZhbCwgZmluZC0+c3RyaW5ndmFsKTsKQEAgLTkxMDgsMTMgKzkxMzIsMTMgQEAKICAgeG1sQnVmZmVyUHRyIHRhcmdldDsKICAgY29uc3QgeG1sQ2hhciAqcG9pbnQ7CiAgIGludCBvZmZzZXQ7Ci0gIAorCiAgIENIRUNLX0FSSVRZKDIpOwogICBDQVNUX1RPX1NUUklORzsKICAgZmluZCA9IHZhbHVlUG9wKGN0eHQpOwogICBDQVNUX1RPX1NUUklORzsKICAgc3RyID0gdmFsdWVQb3AoY3R4dCk7Ci0gIAorCiAgIHRhcmdldCA9IHhtbEJ1ZmZlckNyZWF0ZSgpOwogICBpZiAodGFyZ2V0KSB7CiAgICAgcG9pbnQgPSB4bWxTdHJzdHIoc3RyLT5zdHJpbmd2YWwsIGZpbmQtPnN0cmluZ3ZhbCk7CkBAIC05MTI0LDcgKzkxNDgsNyBAQAogCQkgICB4bWxTdHJsZW4oc3RyLT5zdHJpbmd2YWwpIC0gb2Zmc2V0KTsKICAgICB9CiAgICAgdmFsdWVQdXNoKGN0eHQsIHhtbFhQYXRoQ2FjaGVOZXdTdHJpbmcoY3R4dC0+Y29udGV4dCwKLQl4bWxCdWZmZXJDb250ZW50KHRhcmdldCkpKTsgICAgCisJeG1sQnVmZmVyQ29udGVudCh0YXJnZXQpKSk7CiAgICAgeG1sQnVmZmVyRnJlZSh0YXJnZXQpOwogICB9CiAgIHhtbFhQYXRoUmVsZWFzZU9iamVjdChjdHh0LT5jb250ZXh0LCBzdHIpOwpAQCAtOTE1MSw3ICs5MTc1LDcgQEAKICAgeG1sQ2hhciAqc291cmNlID0gTlVMTDsKICAgeG1sQnVmZmVyUHRyIHRhcmdldDsKICAgeG1sQ2hhciBibGFuazsKLSAgCisKICAgaWYgKGN0eHQgPT0gTlVMTCkgcmV0dXJuOwogICBpZiAobmFyZ3MgPT0gMCkgewogICAgIC8qIFVzZSBjdXJyZW50IGNvbnRleHQgbm9kZSAqLwpAQCAtOTE2OSwxMSArOTE5MywxMSBAQAogCiAgIHRhcmdldCA9IHhtbEJ1ZmZlckNyZWF0ZSgpOwogICBpZiAodGFyZ2V0ICYmIHNvdXJjZSkgewotICAgIAorCiAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2VzICovCiAgICAgd2hpbGUgKElTX0JMQU5LX0NIKCpzb3VyY2UpKQogICAgICAgc291cmNlKys7Ci0gIAorCiAgICAgLyogQ29sbGFwc2UgaW50ZXJtZWRpYXRlIHdoaXRlc3BhY2VzLCBhbmQgc2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlcyAqLwogICAgIGJsYW5rID0gMDsKICAgICB3aGlsZSAoKnNvdXJjZSkgewpAQCAtOTQ0OCw3ICs5NDcyLDcgQEAKICAgICBkb3VibGUgcmVzID0gMC4wOwogCiAgICAgQ0hFQ0tfQVJJVFkoMSk7Ci0gICAgaWYgKChjdHh0LT52YWx1ZSA9PSBOVUxMKSB8fCAKKyAgICBpZiAoKGN0eHQtPnZhbHVlID09IE5VTEwpIHx8CiAJKChjdHh0LT52YWx1ZS0+dHlwZSAhPSBYUEFUSF9OT0RFU0VUKSAmJgogCSAoY3R4dC0+dmFsdWUtPnR5cGUgIT0gWFBBVEhfWFNMVF9UUkVFKSkpCiAJWFBfRVJST1IoWFBBVEhfSU5WQUxJRF9UWVBFKTsKQEAgLTk1NjcsMTQgKzk1OTEsMTQgQEAKICAgICBpZiAoY3R4dC0+dmFsdWUtPmZsb2F0dmFsIDwgMCkgewogCWlmIChjdHh0LT52YWx1ZS0+ZmxvYXR2YWwgPCBmIC0gMC41KQogCSAgICBjdHh0LT52YWx1ZS0+ZmxvYXR2YWwgPSBmIC0gMTsKLQllbHNlIAorCWVsc2UKIAkgICAgY3R4dC0+dmFsdWUtPmZsb2F0dmFsID0gZjsKIAlpZiAoY3R4dC0+dmFsdWUtPmZsb2F0dmFsID09IDApCiAJICAgIGN0eHQtPnZhbHVlLT5mbG9hdHZhbCA9IHhtbFhQYXRoTlpFUk87CiAgICAgfSBlbHNlIHsKIAlpZiAoY3R4dC0+dmFsdWUtPmZsb2F0dmFsIDwgZiArIDAuNSkKIAkgICAgY3R4dC0+dmFsdWUtPmZsb2F0dmFsID0gZjsKLQllbHNlIAorCWVsc2UKIAkgICAgY3R4dC0+dmFsdWUtPmZsb2F0dmFsID0gZiArIDE7CiAgICAgfQogfQpAQCAtOTYyNSw3ICs5NjQ5LDcgQEAKICAgICAgKiBVQ1MtNCByYW5nZSAoaGV4LikgICAgICAgICAgIFVURi04IG9jdGV0IHNlcXVlbmNlIChiaW5hcnkpCiAgICAgICogMDAwMCAwMDAwLTAwMDAgMDA3RiAgIDB4eHh4eHh4CiAgICAgICogMDAwMCAwMDgwLTAwMDAgMDdGRiAgIDExMHh4eHh4IDEweHh4eHh4Ci0gICAgICogMDAwMCAwODAwLTAwMDAgRkZGRiAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4IAorICAgICAqIDAwMDAgMDgwMC0wMDAwIEZGRkYgICAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eAogICAgICAqCiAgICAgICogQ2hlY2sgZm9yIHRoZSAweDExMDAwMCBsaW1pdCB0b28KICAgICAgKi8KQEAgLTk2NjIsNyArOTY4Niw3IEBACiAJfQogCWlmICghSVNfQ0hBUih2YWwpKSB7CiAJICAgIFhQX0VSUk9SMChYUEFUSF9JTlZBTElEX0NIQVJfRVJST1IpOwotCX0gICAgCisJfQogCXJldHVybih2YWwpOwogICAgIH0gZWxzZSB7CiAJLyogMS1ieXRlIGNvZGUgKi8KQEAgLTk3MzQsNyArOTc1OCw3IEBACiAvKioKICAqIHhtbFhQYXRoUGFyc2VRTmFtZToKICAqIEBjdHh0OiAgdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0Ci0gKiBAcHJlZml4OiAgYSB4bWxDaGFyICoqIAorICogQHByZWZpeDogIGEgeG1sQ2hhciAqKgogICoKICAqIHBhcnNlIGFuIFhNTCBxdWFsaWZpZWQgbmFtZQogICoKQEAgLTk3NTQsNyArOTc3OCw3IEBACiAKICAgICAqcHJlZml4ID0gTlVMTDsKICAgICByZXQgPSB4bWxYUGF0aFBhcnNlTkNOYW1lKGN0eHQpOwotICAgIGlmIChDVVIgPT0gJzonKSB7CisgICAgaWYgKHJldCAmJiBDVVIgPT0gJzonKSB7CiAgICAgICAgICpwcmVmaXggPSByZXQ7CiAJTkVYVDsKIAlyZXQgPSB4bWxYUGF0aFBhcnNlTkNOYW1lKGN0eHQpOwpAQCAtOTgyOCw3ICs5ODUyLDcgQEAKICAgICB3aGlsZSAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnPicpICYmIChjICE9ICcvJykgJiYgLyogdGVzdCBiaWduYW1lLnhtbCAqLwogCSAgICgoSVNfTEVUVEVSKGMpKSB8fCAoSVNfRElHSVQoYykpIHx8CiAgICAgICAgICAgICAoYyA9PSAnLicpIHx8IChjID09ICctJykgfHwKLQkgICAgKGMgPT0gJ18nKSB8fCAoKHF1YWxpZmllZCkgJiYgKGMgPT0gJzonKSkgfHwgCisJICAgIChjID09ICdfJykgfHwgKChxdWFsaWZpZWQpICYmIChjID09ICc6JykpIHx8CiAJICAgIChJU19DT01CSU5JTkcoYykpIHx8CiAJICAgIChJU19FWFRFTkRFUihjKSkpKSB7CiAJQ09QWV9CVUYobCxidWYsbGVuLGMpOwpAQCAtOTg0MSw3ICs5ODY1LDcgQEAKIAkgICAgICovCiAJICAgIHhtbENoYXIgKmJ1ZmZlcjsKIAkgICAgaW50IG1heCA9IGxlbiAqIDI7Ci0JICAgIAorCiAJICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvY0F0b21pYyhtYXggKiBzaXplb2YoeG1sQ2hhcikpOwogCSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJWFBfRVJST1JOVUxMKFhQQVRIX01FTU9SWV9FUlJPUik7CkBAIC05ODQ5LDcgKzk4NzMsNyBAQAogCSAgICBtZW1jcHkoYnVmZmVyLCBidWYsIGxlbik7CiAJICAgIHdoaWxlICgoSVNfTEVUVEVSKGMpKSB8fCAoSVNfRElHSVQoYykpIHx8IC8qIHRlc3QgYmlnbmFtZS54bWwgKi8KIAkJICAgKGMgPT0gJy4nKSB8fCAoYyA9PSAnLScpIHx8Ci0JCSAgIChjID09ICdfJykgfHwgKChxdWFsaWZpZWQpICYmIChjID09ICc6JykpIHx8IAorCQkgICAoYyA9PSAnXycpIHx8ICgocXVhbGlmaWVkKSAmJiAoYyA9PSAnOicpKSB8fAogCQkgICAoSVNfQ09NQklOSU5HKGMpKSB8fAogCQkgICAoSVNfRVhURU5ERVIoYykpKSB7CiAJCWlmIChsZW4gKyAxMCA+IG1heCkgewpAQCAtOTg5Niw3ICs5OTIwLDcgQEAKICAqICBbMzBhXSAgRmxvYXQgIDo6PSBOdW1iZXIgKCdlJyBEaWdpdHM/KT8KICAqCiAgKiAgWzMwXSAgIE51bWJlciA6Oj0gICBEaWdpdHMgKCcuJyBEaWdpdHM/KT8KLSAqICAgICAgICAgICAgICAgICAgICB8ICcuJyBEaWdpdHMgCisgKiAgICAgICAgICAgICAgICAgICAgfCAnLicgRGlnaXRzCiAgKiAgWzMxXSAgIERpZ2l0cyA6Oj0gICBbMC05XSsKICAqCiAgKiBDb21waWxlIGEgTnVtYmVyIGluIHRoZSBzdHJpbmcKQEAgLTk5OTUsNyArMTAwMTksNyBAQAogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCiAgKiAgWzMwXSAgIE51bWJlciA6Oj0gICBEaWdpdHMgKCcuJyBEaWdpdHM/KT8KLSAqICAgICAgICAgICAgICAgICAgICB8ICcuJyBEaWdpdHMgCisgKiAgICAgICAgICAgICAgICAgICAgfCAnLicgRGlnaXRzCiAgKiAgWzMxXSAgIERpZ2l0cyA6Oj0gICBbMC05XSsKICAqCiAgKiBDb21waWxlIGEgTnVtYmVyLCB0aGVuIHB1c2ggaXQgb24gdGhlIHN0YWNrCkBAIC0xMDE3NSw5ICsxMDE5OSw5IEBACiAgKgogICogRWFybHkgZXZhbHVhdGlvbiBpcyBwb3NzaWJsZSBzaW5jZToKICAqIFRoZSB2YXJpYWJsZSBiaW5kaW5ncyBbLi4uXSB1c2VkIHRvIGV2YWx1YXRlIGEgc3ViZXhwcmVzc2lvbiBhcmUKLSAqIGFsd2F5cyB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIHRvIGV2YWx1YXRlIHRoZSBjb250YWluaW5nIGV4cHJlc3Npb24uIAorICogYWx3YXlzIHRoZSBzYW1lIGFzIHRob3NlIHVzZWQgdG8gZXZhbHVhdGUgdGhlIGNvbnRhaW5pbmcgZXhwcmVzc2lvbi4KICAqCi0gKiAgWzM2XSAgIFZhcmlhYmxlUmVmZXJlbmNlIDo6PSAgICckJyBRTmFtZSAKKyAqICBbMzZdICAgVmFyaWFibGVSZWZlcmVuY2UgOjo9ICAgJyQnIFFOYW1lCiAgKi8KIHN0YXRpYyB2b2lkCiB4bWxYUGF0aENvbXBWYXJpYWJsZVJlZmVyZW5jZSh4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dCkgewpAQCAtMTAyMzYsNyArMTAyNjAsNyBAQAogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCiAgKiAgWzE2XSAgIEZ1bmN0aW9uQ2FsbCA6Oj0gICBGdW5jdGlvbk5hbWUgJygnICggQXJndW1lbnQgKCAnLCcgQXJndW1lbnQpKik/ICcpJwotICogIFsxN10gICBBcmd1bWVudCA6Oj0gICBFeHByIAorICogIFsxN10gICBBcmd1bWVudCA6Oj0gICBFeHByCiAgKgogICogQ29tcGlsZSBhIGZ1bmN0aW9uIGNhbGwsIHRoZSBldmFsdWF0aW9uIG9mIGFsbCBhcmd1bWVudHMgYXJlCiAgKiBwdXNoZWQgb24gdGhlIHN0YWNrCkBAIC0xMDI1MCw2ICsxMDI3NCw3IEBACiAKICAgICBuYW1lID0geG1sWFBhdGhQYXJzZVFOYW1lKGN0eHQsICZwcmVmaXgpOwogICAgIGlmIChuYW1lID09IE5VTEwpIHsKKwl4bWxGcmVlKHByZWZpeCk7CiAJWFBfRVJST1IoWFBBVEhfRVhQUl9FUlJPUik7CiAgICAgfQogICAgIFNLSVBfQkxBTktTOwpAQCAtMTAyODIsNyArMTAzMDcsMTEgQEAKIAkgICAgaW50IG9wMSA9IGN0eHQtPmNvbXAtPmxhc3Q7CiAJICAgIGN0eHQtPmNvbXAtPmxhc3QgPSAtMTsKIAkgICAgeG1sWFBhdGhDb21waWxlRXhwcihjdHh0LCBzb3J0KTsKLQkgICAgQ0hFQ0tfRVJST1I7CisJICAgIGlmIChjdHh0LT5lcnJvciAhPSBYUEFUSF9FWFBSRVNTSU9OX09LKSB7CisJCXhtbEZyZWUobmFtZSk7CisJCXhtbEZyZWUocHJlZml4KTsKKwkJcmV0dXJuOworCSAgICB9CiAJICAgIFBVU0hfQklOQVJZX0VYUFIoWFBBVEhfT1BfQVJHLCBvcDEsIGN0eHQtPmNvbXAtPmxhc3QsIDAsIDApOwogCSAgICBuYmFyZ3MrKzsKIAkgICAgaWYgKENVUiA9PSAnKScpIGJyZWFrOwpAQCAtMTAzMDMsMTEgKzEwMzMyLDExIEBACiAgKiB4bWxYUGF0aENvbXBQcmltYXJ5RXhwcjoKICAqIEBjdHh0OiAgdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0CiAgKgotICogIFsxNV0gICBQcmltYXJ5RXhwciA6Oj0gICBWYXJpYWJsZVJlZmVyZW5jZSAKKyAqICBbMTVdICAgUHJpbWFyeUV4cHIgOjo9ICAgVmFyaWFibGVSZWZlcmVuY2UKICAqICAgICAgICAgICAgICAgIHwgJygnIEV4cHIgJyknCi0gKiAgICAgICAgICAgICAgICB8IExpdGVyYWwgCi0gKiAgICAgICAgICAgICAgICB8IE51bWJlciAKLSAqICAgICAgICAgICAgICAgIHwgRnVuY3Rpb25DYWxsIAorICogICAgICAgICAgICAgICAgfCBMaXRlcmFsCisgKiAgICAgICAgICAgICAgICB8IE51bWJlcgorICogICAgICAgICAgICAgICAgfCBGdW5jdGlvbkNhbGwKICAqCiAgKiBDb21waWxlIGEgcHJpbWFyeSBleHByZXNzaW9uLgogICovCkBAIC0xMDMzOSw4ICsxMDM2OCw4IEBACiAgKiB4bWxYUGF0aENvbXBGaWx0ZXJFeHByOgogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCi0gKiAgWzIwXSAgIEZpbHRlckV4cHIgOjo9ICAgUHJpbWFyeUV4cHIgCi0gKiAgICAgICAgICAgICAgIHwgRmlsdGVyRXhwciBQcmVkaWNhdGUgCisgKiAgWzIwXSAgIEZpbHRlckV4cHIgOjo9ICAgUHJpbWFyeUV4cHIKKyAqICAgICAgICAgICAgICAgfCBGaWx0ZXJFeHByIFByZWRpY2F0ZQogICoKICAqIENvbXBpbGUgYSBmaWx0ZXIgZXhwcmVzc2lvbi4KICAqIFNxdWFyZSBicmFja2V0cyBhcmUgdXNlZCB0byBmaWx0ZXIgZXhwcmVzc2lvbnMgaW4gdGhlIHNhbWUgd2F5IHRoYXQKQEAgLTEwMzU1LDEzICsxMDM4NCwxMyBAQAogICAgIHhtbFhQYXRoQ29tcFByaW1hcnlFeHByKGN0eHQpOwogICAgIENIRUNLX0VSUk9SOwogICAgIFNLSVBfQkxBTktTOwotICAgIAorCiAgICAgd2hpbGUgKENVUiA9PSAnWycpIHsKIAl4bWxYUGF0aENvbXBQcmVkaWNhdGUoY3R4dCwgMSk7CiAJU0tJUF9CTEFOS1M7CiAgICAgfQogCi0gICAgCisKIH0KIAogLyoqCkBAIC0xMDQwMCw3ICsxMDQyOSw3IEBACiAgICAgd2hpbGUgKChjICE9ICcgJykgJiYgKGMgIT0gJz4nKSAmJiAoYyAhPSAnLycpICYmIC8qIHRlc3QgYmlnbmFtZS54bWwgKi8KIAkgICAoKElTX0xFVFRFUihjKSkgfHwgKElTX0RJR0lUKGMpKSB8fAogICAgICAgICAgICAgKGMgPT0gJy4nKSB8fCAoYyA9PSAnLScpIHx8Ci0JICAgIChjID09ICdfJykgfHwgKGMgPT0gJzonKSB8fCAKKwkgICAgKGMgPT0gJ18nKSB8fCAoYyA9PSAnOicpIHx8CiAJICAgIChJU19DT01CSU5JTkcoYykpIHx8CiAJICAgIChJU19FWFRFTkRFUihjKSkpKSB7CiAJbGVuICs9IGw7CkBAIC0xMDQxNiwxMCArMTA0NDUsMTAgQEAKICAqIHhtbFhQYXRoQ29tcFBhdGhFeHByOgogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCi0gKiAgWzE5XSAgIFBhdGhFeHByIDo6PSAgIExvY2F0aW9uUGF0aCAKLSAqICAgICAgICAgICAgICAgfCBGaWx0ZXJFeHByIAotICogICAgICAgICAgICAgICB8IEZpbHRlckV4cHIgJy8nIFJlbGF0aXZlTG9jYXRpb25QYXRoIAotICogICAgICAgICAgICAgICB8IEZpbHRlckV4cHIgJy8vJyBSZWxhdGl2ZUxvY2F0aW9uUGF0aCAKKyAqICBbMTldICAgUGF0aEV4cHIgOjo9ICAgTG9jYXRpb25QYXRoCisgKiAgICAgICAgICAgICAgIHwgRmlsdGVyRXhwcgorICogICAgICAgICAgICAgICB8IEZpbHRlckV4cHIgJy8nIFJlbGF0aXZlTG9jYXRpb25QYXRoCisgKiAgICAgICAgICAgICAgIHwgRmlsdGVyRXhwciAnLy8nIFJlbGF0aXZlTG9jYXRpb25QYXRoCiAgKgogICogQ29tcGlsZSBhIHBhdGggZXhwcmVzc2lvbi4KICAqIFRoZSAvIG9wZXJhdG9yIGFuZCAvLyBvcGVyYXRvcnMgY29tYmluZSBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbgpAQCAtMTA0MzYsOCArMTA0NjUsOCBAQAogICAgIHhtbENoYXIgKm5hbWUgPSBOVUxMOyAvKiB3ZSBtYXkgaGF2ZSB0byBwcmVwYXJzZSBhIG5hbWUgdG8gZmluZCBvdXQgKi8KIAogICAgIFNLSVBfQkxBTktTOwotICAgIGlmICgoQ1VSID09ICckJykgfHwgKENVUiA9PSAnKCcpIHx8IAotICAgIAkoSVNfQVNDSUlfRElHSVQoQ1VSKSkgfHwKKyAgICBpZiAoKENVUiA9PSAnJCcpIHx8IChDVVIgPT0gJygnKSB8fAorCShJU19BU0NJSV9ESUdJVChDVVIpKSB8fAogICAgICAgICAoQ1VSID09ICdcJycpIHx8IChDVVIgPT0gJyInKSB8fAogCShDVVIgPT0gJy4nICYmIElTX0FTQ0lJX0RJR0lUKE5YVCgxKSkpKSB7CiAJbGMgPSAwOwpAQCAtMTA0NzcsNyArMTA1MDYsNyBAQAogCX0gZWxzZSBpZiAobmFtZSAhPSBOVUxMKSB7CiAJICAgIGludCBsZW4gPXhtbFN0cmxlbihuYW1lKTsKIAotCSAgICAKKwogCSAgICB3aGlsZSAoTlhUKGxlbikgIT0gMCkgewogCQlpZiAoTlhUKGxlbikgPT0gJy8nKSB7CiAJCSAgICAvKiBlbGVtZW50IG5hbWUgKi8KQEAgLTEwNTQ0LDcgKzEwNTczLDcgQEAKIAkgICAgLyogbWFrZSBzdXJlIGFsbCBjYXNlcyBhcmUgY292ZXJlZCBleHBsaWNpdGx5ICovCiAJICAgIFhQX0VSUk9SKFhQQVRIX0VYUFJfRVJST1IpOwogCX0KLSAgICB9IAorICAgIH0KIAogICAgIGlmIChsYykgewogCWlmIChDVVIgPT0gJy8nKSB7CkBAIC0xMDU3Niw4ICsxMDYwNSw4IEBACiAgKiB4bWxYUGF0aENvbXBVbmlvbkV4cHI6CiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKLSAqICBbMThdICAgVW5pb25FeHByIDo6PSAgIFBhdGhFeHByIAotICogICAgICAgICAgICAgICB8IFVuaW9uRXhwciAnfCcgUGF0aEV4cHIgCisgKiAgWzE4XSAgIFVuaW9uRXhwciA6Oj0gICBQYXRoRXhwcgorICogICAgICAgICAgICAgICB8IFVuaW9uRXhwciAnfCcgUGF0aEV4cHIKICAqCiAgKiBDb21waWxlIGFuIHVuaW9uIGV4cHJlc3Npb24uCiAgKi8KQEAgLTEwNjA1LDggKzEwNjM0LDggQEAKICAqIHhtbFhQYXRoQ29tcFVuYXJ5RXhwcjoKICAqIEBjdHh0OiAgdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0CiAgKgotICogIFsyN10gICBVbmFyeUV4cHIgOjo9ICAgVW5pb25FeHByIAotICogICAgICAgICAgICAgICAgICAgfCAnLScgVW5hcnlFeHByIAorICogIFsyN10gICBVbmFyeUV4cHIgOjo9ICAgVW5pb25FeHByCisgKiAgICAgICAgICAgICAgICAgICB8ICctJyBVbmFyeUV4cHIKICAqCiAgKiBDb21waWxlIGFuIHVuYXJ5IGV4cHJlc3Npb24uCiAgKi8KQEAgLTEwNjM4LDEwICsxMDY2NywxMCBAQAogICogeG1sWFBhdGhDb21wTXVsdGlwbGljYXRpdmVFeHByOgogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCi0gKiAgWzI2XSAgIE11bHRpcGxpY2F0aXZlRXhwciA6Oj0gICBVbmFyeUV4cHIgCi0gKiAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aXZlRXhwciBNdWx0aXBseU9wZXJhdG9yIFVuYXJ5RXhwciAKLSAqICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpdmVFeHByICdkaXYnIFVuYXJ5RXhwciAKLSAqICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpdmVFeHByICdtb2QnIFVuYXJ5RXhwciAKKyAqICBbMjZdICAgTXVsdGlwbGljYXRpdmVFeHByIDo6PSAgIFVuYXJ5RXhwcgorICogICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGl2ZUV4cHIgTXVsdGlwbHlPcGVyYXRvciBVbmFyeUV4cHIKKyAqICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpdmVFeHByICdkaXYnIFVuYXJ5RXhwcgorICogICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGl2ZUV4cHIgJ21vZCcgVW5hcnlFeHByCiAgKiAgWzM0XSAgIE11bHRpcGx5T3BlcmF0b3IgOjo9ICAgJyonCiAgKgogICogQ29tcGlsZSBhbiBBZGRpdGl2ZSBleHByZXNzaW9uLgpAQCAtMTA2NTIsNyArMTA2ODEsNyBAQAogICAgIHhtbFhQYXRoQ29tcFVuYXJ5RXhwcihjdHh0KTsKICAgICBDSEVDS19FUlJPUjsKICAgICBTS0lQX0JMQU5LUzsKLSAgICB3aGlsZSAoKENVUiA9PSAnKicpIHx8IAorICAgIHdoaWxlICgoQ1VSID09ICcqJykgfHwKICAgICAgICAgICAgKChDVVIgPT0gJ2QnKSAmJiAoTlhUKDEpID09ICdpJykgJiYgKE5YVCgyKSA9PSAndicpKSB8fAogICAgICAgICAgICAoKENVUiA9PSAnbScpICYmIChOWFQoMSkgPT0gJ28nKSAmJiAoTlhUKDIpID09ICdkJykpKSB7CiAJaW50IG9wID0gLTE7CkBAIC0xMDY4MCw5ICsxMDcwOSw5IEBACiAgKiB4bWxYUGF0aENvbXBBZGRpdGl2ZUV4cHI6CiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKLSAqICBbMjVdICAgQWRkaXRpdmVFeHByIDo6PSAgIE11bHRpcGxpY2F0aXZlRXhwciAKLSAqICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpdmVFeHByICcrJyBNdWx0aXBsaWNhdGl2ZUV4cHIgCi0gKiAgICAgICAgICAgICAgICAgICB8IEFkZGl0aXZlRXhwciAnLScgTXVsdGlwbGljYXRpdmVFeHByIAorICogIFsyNV0gICBBZGRpdGl2ZUV4cHIgOjo9ICAgTXVsdGlwbGljYXRpdmVFeHByCisgKiAgICAgICAgICAgICAgICAgICB8IEFkZGl0aXZlRXhwciAnKycgTXVsdGlwbGljYXRpdmVFeHByCisgKiAgICAgICAgICAgICAgICAgICB8IEFkZGl0aXZlRXhwciAnLScgTXVsdGlwbGljYXRpdmVFeHByCiAgKgogICogQ29tcGlsZSBhbiBBZGRpdGl2ZSBleHByZXNzaW9uLgogICovCkBAIC0xMDcxMiwxMSArMTA3NDEsMTEgQEAKICAqIHhtbFhQYXRoQ29tcFJlbGF0aW9uYWxFeHByOgogICogQGN0eHQ6ICB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQKICAqCi0gKiAgWzI0XSAgIFJlbGF0aW9uYWxFeHByIDo6PSAgIEFkZGl0aXZlRXhwciAKLSAqICAgICAgICAgICAgICAgICB8IFJlbGF0aW9uYWxFeHByICc8JyBBZGRpdGl2ZUV4cHIgCi0gKiAgICAgICAgICAgICAgICAgfCBSZWxhdGlvbmFsRXhwciAnPicgQWRkaXRpdmVFeHByIAotICogICAgICAgICAgICAgICAgIHwgUmVsYXRpb25hbEV4cHIgJzw9JyBBZGRpdGl2ZUV4cHIgCi0gKiAgICAgICAgICAgICAgICAgfCBSZWxhdGlvbmFsRXhwciAnPj0nIEFkZGl0aXZlRXhwciAKKyAqICBbMjRdICAgUmVsYXRpb25hbEV4cHIgOjo9ICAgQWRkaXRpdmVFeHByCisgKiAgICAgICAgICAgICAgICAgfCBSZWxhdGlvbmFsRXhwciAnPCcgQWRkaXRpdmVFeHByCisgKiAgICAgICAgICAgICAgICAgfCBSZWxhdGlvbmFsRXhwciAnPicgQWRkaXRpdmVFeHByCisgKiAgICAgICAgICAgICAgICAgfCBSZWxhdGlvbmFsRXhwciAnPD0nIEFkZGl0aXZlRXhwcgorICogICAgICAgICAgICAgICAgIHwgUmVsYXRpb25hbEV4cHIgJz49JyBBZGRpdGl2ZUV4cHIKICAqCiAgKiAgQSA8PSBCID4gQyBpcyBhbGxvd2VkID8gQW5zd2VyIGZyb20gSmFtZXMsIHllcyB3aXRoCiAgKiAgKEFkZGl0aXZlRXhwciA8PSBBZGRpdGl2ZUV4cHIpID4gQWRkaXRpdmVFeHByCkBAIC0xMDc1Niw5ICsxMDc4NSw5IEBACiAgKiB4bWxYUGF0aENvbXBFcXVhbGl0eUV4cHI6CiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKLSAqICBbMjNdICAgRXF1YWxpdHlFeHByIDo6PSAgIFJlbGF0aW9uYWxFeHByIAotICogICAgICAgICAgICAgICAgIHwgRXF1YWxpdHlFeHByICc9JyBSZWxhdGlvbmFsRXhwciAKLSAqICAgICAgICAgICAgICAgICB8IEVxdWFsaXR5RXhwciAnIT0nIFJlbGF0aW9uYWxFeHByIAorICogIFsyM10gICBFcXVhbGl0eUV4cHIgOjo9ICAgUmVsYXRpb25hbEV4cHIKKyAqICAgICAgICAgICAgICAgICB8IEVxdWFsaXR5RXhwciAnPScgUmVsYXRpb25hbEV4cHIKKyAqICAgICAgICAgICAgICAgICB8IEVxdWFsaXR5RXhwciAnIT0nIFJlbGF0aW9uYWxFeHByCiAgKgogICogIEEgIT0gQiAhPSBDIGlzIGFsbG93ZWQgPyBBbnN3ZXIgZnJvbSBKYW1lcywgeWVzIHdpdGgKICAqICAoUmVsYXRpb25hbEV4cHIgPSBSZWxhdGlvbmFsRXhwcikgPSBSZWxhdGlvbmFsRXhwcgpAQCAtMTA3OTMsOCArMTA4MjIsOCBAQAogICogeG1sWFBhdGhDb21wQW5kRXhwcjoKICAqIEBjdHh0OiAgdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0CiAgKgotICogIFsyMl0gICBBbmRFeHByIDo6PSAgIEVxdWFsaXR5RXhwciAKLSAqICAgICAgICAgICAgICAgICB8IEFuZEV4cHIgJ2FuZCcgRXF1YWxpdHlFeHByIAorICogIFsyMl0gICBBbmRFeHByIDo6PSAgIEVxdWFsaXR5RXhwcgorICogICAgICAgICAgICAgICAgIHwgQW5kRXhwciAnYW5kJyBFcXVhbGl0eUV4cHIKICAqCiAgKiBDb21waWxlIGFuIEFORCBleHByZXNzaW9uLgogICoKQEAgLTEwODE5LDkgKzEwODQ4LDkgQEAKICAqIHhtbFhQYXRoQ29tcGlsZUV4cHI6CiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKLSAqICBbMTRdICAgRXhwciA6Oj0gICBPckV4cHIgCi0gKiAgWzIxXSAgIE9yRXhwciA6Oj0gICBBbmRFeHByIAotICogICAgICAgICAgICAgICAgIHwgT3JFeHByICdvcicgQW5kRXhwciAKKyAqICBbMTRdICAgRXhwciA6Oj0gICBPckV4cHIKKyAqICBbMjFdICAgT3JFeHByIDo6PSAgIEFuZEV4cHIKKyAqICAgICAgICAgICAgICAgICB8IE9yRXhwciAnb3InIEFuZEV4cHIKICAqCiAgKiBQYXJzZSBhbmQgY29tcGlsZSBhbiBleHByZXNzaW9uCiAgKi8KQEAgLTEwODU3LDcgKzEwODg2LDcgQEAKICAqIEBmaWx0ZXI6ICBhY3QgYXMgYSBmaWx0ZXIKICAqCiAgKiAgWzhdICAgUHJlZGljYXRlIDo6PSAgICdbJyBQcmVkaWNhdGVFeHByICddJwotICogIFs5XSAgIFByZWRpY2F0ZUV4cHIgOjo9ICAgRXhwciAKKyAqICBbOV0gICBQcmVkaWNhdGVFeHByIDo6PSAgIEV4cHIKICAqCiAgKiBDb21waWxlIGEgcHJlZGljYXRlIGV4cHJlc3Npb24KICAqLwpAQCAtMTA5NzQsNyArMTEwMDMsNyBAQAogCX0KIAogCSp0ZXN0ID0gTk9ERV9URVNUX1RZUEU7Ci0JCisKIAlTS0lQX0JMQU5LUzsKIAlpZiAoKnR5cGUgPT0gTk9ERV9UWVBFX1BJKSB7CiAJICAgIC8qCkBAIC0xMTExMCw3ICsxMTEzOSw3IEBACiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKICAqIFs0XSBTdGVwIDo6PSAgIEF4aXNTcGVjaWZpZXIgTm9kZVRlc3QgUHJlZGljYXRlKgotICogICAgICAgICAgICAgICAgICB8IEFiYnJldmlhdGVkU3RlcCAKKyAqICAgICAgICAgICAgICAgICAgfCBBYmJyZXZpYXRlZFN0ZXAKICAqCiAgKiBbMTJdIEFiYnJldmlhdGVkU3RlcCA6Oj0gICAnLicgfCAnLi4nCiAgKgpAQCAtMTEyODIsMTAgKzExMzExLDEwIEBACiAgKiB4bWxYUGF0aENvbXBSZWxhdGl2ZUxvY2F0aW9uUGF0aDoKICAqIEBjdHh0OiAgdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0CiAgKgotICogIFszXSAgIFJlbGF0aXZlTG9jYXRpb25QYXRoIDo6PSAgIFN0ZXAgCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgUmVsYXRpdmVMb2NhdGlvblBhdGggJy8nIFN0ZXAgCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgQWJicmV2aWF0ZWRSZWxhdGl2ZUxvY2F0aW9uUGF0aCAKLSAqICBbMTFdICBBYmJyZXZpYXRlZFJlbGF0aXZlTG9jYXRpb25QYXRoIDo6PSAgIFJlbGF0aXZlTG9jYXRpb25QYXRoICcvLycgU3RlcCAKKyAqICBbM10gICBSZWxhdGl2ZUxvY2F0aW9uUGF0aCA6Oj0gICBTdGVwCisgKiAgICAgICAgICAgICAgICAgICAgIHwgUmVsYXRpdmVMb2NhdGlvblBhdGggJy8nIFN0ZXAKKyAqICAgICAgICAgICAgICAgICAgICAgfCBBYmJyZXZpYXRlZFJlbGF0aXZlTG9jYXRpb25QYXRoCisgKiAgWzExXSAgQWJicmV2aWF0ZWRSZWxhdGl2ZUxvY2F0aW9uUGF0aCA6Oj0gICBSZWxhdGl2ZUxvY2F0aW9uUGF0aCAnLy8nIFN0ZXAKICAqCiAgKiBDb21waWxlIGEgcmVsYXRpdmUgbG9jYXRpb24gcGF0aC4KICAqLwpAQCAtMTEzMjQsMTIgKzExMzUzLDEyIEBACiAgKiB4bWxYUGF0aENvbXBMb2NhdGlvblBhdGg6CiAgKiBAY3R4dDogIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dAogICoKLSAqICBbMV0gICBMb2NhdGlvblBhdGggOjo9ICAgUmVsYXRpdmVMb2NhdGlvblBhdGggCi0gKiAgICAgICAgICAgICAgICAgICAgIHwgQWJzb2x1dGVMb2NhdGlvblBhdGggCisgKiAgWzFdICAgTG9jYXRpb25QYXRoIDo6PSAgIFJlbGF0aXZlTG9jYXRpb25QYXRoCisgKiAgICAgICAgICAgICAgICAgICAgIHwgQWJzb2x1dGVMb2NhdGlvblBhdGgKICAqICBbMl0gICBBYnNvbHV0ZUxvY2F0aW9uUGF0aCA6Oj0gICAnLycgUmVsYXRpdmVMb2NhdGlvblBhdGg/Ci0gKiAgICAgICAgICAgICAgICAgICAgIHwgQWJicmV2aWF0ZWRBYnNvbHV0ZUxvY2F0aW9uUGF0aCAKLSAqICBbMTBdICAgQWJicmV2aWF0ZWRBYnNvbHV0ZUxvY2F0aW9uUGF0aCA6Oj0gICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8vJyBSZWxhdGl2ZUxvY2F0aW9uUGF0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgfCBBYmJyZXZpYXRlZEFic29sdXRlTG9jYXRpb25QYXRoCisgKiAgWzEwXSAgIEFiYnJldmlhdGVkQWJzb2x1dGVMb2NhdGlvblBhdGggOjo9CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICcvLycgUmVsYXRpdmVMb2NhdGlvblBhdGgKICAqCiAgKiBDb21waWxlIGEgbG9jYXRpb24gcGF0aAogICoKQEAgLTExMzY4LDcgKzExMzk3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCi0gKiAJCVhQYXRoIHByZWNvbXBpbGVkIGV4cHJlc3Npb24gZXZhbHVhdGlvbgkJCSoKKyAqCQlYUGF0aCBwcmVjb21waWxlZCBleHByZXNzaW9uIGV2YWx1YXRpb24JCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTExMzc3LDEyICsxMTQwNiwxMSBAQAogCiAjaWZkZWYgREVCVUdfU1RFUAogc3RhdGljIHZvaWQKLXhtbFhQYXRoRGVidWdEdW1wU3RlcEF4aXMoeG1sWFBhdGhBeGlzVmFsIGF4aXMsCi0JCQkgIHhtbFhQYXRoVGVzdFZhbCB0ZXN0LAoreG1sWFBhdGhEZWJ1Z0R1bXBTdGVwQXhpcyh4bWxYUGF0aFN0ZXBPcFB0ciBvcCwKIAkJCSAgaW50IG5iTm9kZXMpCiB7CiAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsICJuZXcgc3RlcCA6ICIpOwotICAgIHN3aXRjaCAoYXhpcykgeworICAgIHN3aXRjaCAob3AtPnZhbHVlKSB7CiAgICAgICAgIGNhc2UgQVhJU19BTkNFU1RPUjoKICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiYXhpcyAnYW5jZXN0b3JzJyAiKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE0MjksMTQgKzExNDU3LDE0IEBACiAgICAgfQogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCSIgY29udGV4dCBjb250YWlucyAlZCBub2Rlc1xuIiwgbmJOb2Rlcyk7Ci0gICAgc3dpdGNoICh0ZXN0KSB7CisgICAgc3dpdGNoIChvcC0+dmFsdWUyKSB7CiAgICAgICAgIGNhc2UgTk9ERV9URVNUX05PTkU6CiAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBzZWFyY2hpbmcgZm9yIG5vbmUgISEhXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5PREVfVEVTVF9UWVBFOgogICAgICAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgc2VhcmNoaW5nIGZvciB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBzZWFyY2hpbmcgZm9yIHR5cGUgJWRcbiIsIG9wLT52YWx1ZTMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTk9ERV9URVNUX1BJOgogICAgICAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC0xMTQ0OSwxNCArMTE0NzcsMTQgQEAKICAgICAgICAgY2FzZSBOT0RFX1RFU1RfTlM6CiAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBzZWFyY2hpbmcgZm9yIG5hbWVzcGFjZSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT52YWx1ZTUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTk9ERV9URVNUX05BTUU6CiAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBzZWFyY2hpbmcgZm9yIG5hbWUgJXNcbiIsIG5hbWUpOwotICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIHNlYXJjaGluZyBmb3IgbmFtZSAlc1xuIiwgb3AtPnZhbHVlNSk7CisgICAgICAgICAgICBpZiAob3AtPnZhbHVlNCkKICAgICAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgd2l0aCBuYW1lc3BhY2UgJXNcbiIsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIHdpdGggbmFtZXNwYWNlICVzXG4iLCBvcC0+dmFsdWU0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgIlRlc3RpbmcgOiAiKTsKQEAgLTExNDg1LDcgKzExNTEzLDcgQEAKIAlDSEVDS19FUlJPUjA7CiAJaWYgKGNvbnRleHRTaXplIDw9IDApCiAJICAgIHJldHVybigwKTsKLSAgICB9ICAgIAorICAgIH0KICAgICBpZiAob3AtPmNoMiAhPSAtMSkgewogCXhtbFhQYXRoQ29udGV4dFB0ciB4cGN0eHQgPSBjdHh0LT5jb250ZXh0OwogCXhtbE5vZGVQdHIgY29udGV4dE5vZGUsIG9sZENvbnRleHROb2RlOwpAQCAtMTE1MjksNyArMTE1NTcsNyBAQAogCS8qCiAJKiBHZXQgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBwcmVkaWNhdGUuCiAJKi8KLQlleHByT3AgPSAmY3R4dC0+Y29tcC0+c3RlcHNbb3AtPmNoMl07CQorCWV4cHJPcCA9ICZjdHh0LT5jb21wLT5zdGVwc1tvcC0+Y2gyXTsKIAluZXdDb250ZXh0U2l6ZSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHNldC0+bm9kZU5yOyBpKyspIHsKIAkgICAgaWYgKHNldC0+bm9kZVRhYltpXSA9PSBOVUxMKQpAQCAtMTE1MzksOCArMTE1NjcsOCBAQAogCSAgICB4cGN0eHQtPm5vZGUgPSBjb250ZXh0Tm9kZTsKIAkgICAgeHBjdHh0LT5jb250ZXh0U2l6ZSA9IGNvbnRleHRTaXplOwogCSAgICB4cGN0eHQtPnByb3hpbWl0eVBvc2l0aW9uID0gKytjb250ZXh0UG9zOwotCSAgICAKLQkgICAgLyoJICAgCisKKwkgICAgLyoKIAkgICAgKiBBbHNvIHNldCB0aGUgeHBhdGggZG9jdW1lbnQgaW4gY2FzZSB0aGluZ3MgbGlrZQogCSAgICAqIGtleSgpIGFyZSBldmFsdWF0ZWQgaW4gdGhlIHByZWRpY2F0ZS4KIAkgICAgKi8KQEAgLTExNTk5LDcgKzExNjI3LDcgQEAKIAkgICAgaWYgKGN0eHQtPnZhbHVlID09IGNvbnRleHRPYmopCiAJCXZhbHVlUG9wKGN0eHQpOwogCSAgICB4bWxYUGF0aFJlbGVhc2VPYmplY3QoeHBjdHh0LCBjb250ZXh0T2JqKTsKLQl9CQorCX0KIGV2YWx1YXRpb25fZXhpdDoKIAlpZiAoZXhwclJlcyAhPSBOVUxMKQogCSAgICB4bWxYUGF0aFJlbGVhc2VPYmplY3QoY3R4dC0+Y29udGV4dCwgZXhwclJlcyk7CkBAIC0xMTY4Myw3ICsxMTcxMSw3IEBACiAJICAgIHhwY3R4dC0+bm9kZSA9IGNvbnRleHROb2RlOwogCSAgICB4cGN0eHQtPmNvbnRleHRTaXplID0gY29udGV4dFNpemU7CiAJICAgIHhwY3R4dC0+cHJveGltaXR5UG9zaXRpb24gPSArK2NvbnRleHRQb3M7Ci0JICAgIAorCiAJICAgIC8qCiAJICAgICogSW5pdGlhbGl6ZSB0aGUgbmV3IHNldC4KIAkgICAgKiBBbHNvIHNldCB0aGUgeHBhdGggZG9jdW1lbnQgaW4gY2FzZSB0aGluZ3MgbGlrZQpAQCAtMTE3MDUsNyArMTE3MzMsNyBAQAogCiAJICAgIHZhbHVlUHVzaChjdHh0LCBjb250ZXh0T2JqKTsKIAkgICAgcmVzID0geG1sWFBhdGhDb21wT3BFdmFsVG9Cb29sZWFuKGN0eHQsIGV4cHJPcCwgMSk7Ci0JICAgIAorCiAJICAgIGlmICgoY3R4dC0+ZXJyb3IgIT0gWFBBVEhfRVhQUkVTU0lPTl9PSykgfHwgKHJlcyA9PSAtMSkpIHsKIAkgICAgICAgIHhtbFhQYXRoT2JqZWN0UHRyIHRtcDsKIAkJLyogcG9wIHRoZSByZXN1bHQgKi8KQEAgLTExNzM3LDkgKzExNzY1LDkgQEAKIAkJICAgIH0KIAkJICAgIHhtbFhQYXRoTm9kZVNldENsZWFyKHNldCwgaGFzTnNOb2Rlcyk7CiAJCSAgICBzZXQtPm5vZGVOciA9IDE7Ci0JCSAgICBzZXQtPm5vZGVUYWJbMF0gPSBjb250ZXh0Tm9kZTsJCSAgIAorCQkgICAgc2V0LT5ub2RlVGFiWzBdID0gY29udGV4dE5vZGU7CiAJCSAgICBnb3RvIGV2YWx1YXRpb25fZXhpdDsKLQkJfQkJCisJCX0KIAkJaWYgKHBvcyA9PSBtYXhQb3MpIHsKIAkJICAgIC8qCiAJCSAgICAqIFdlIGFyZSBkb25lLgpAQCAtMTE4MDMsNyArMTE4MzEsNyBAQAogCiBzdGF0aWMgaW50CiB4bWxYUGF0aElzUG9zaXRpb25hbFByZWRpY2F0ZSh4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dCwKLQkJCSAgICB4bWxYUGF0aFN0ZXBPcFB0ciBvcCwJCQkgICAgCisJCQkgICAgeG1sWFBhdGhTdGVwT3BQdHIgb3AsCiAJCQkgICAgaW50ICptYXhQb3MpCiB7CiAKQEAgLTExODEyLDcgKzExODQwLDcgQEAKICAgICAvKgogICAgICogQklHIE5PVEU6IFRoaXMgaXMgbm90IGludGVuZGVkIGZvciBYUEFUSF9PUF9GSUxURVIgeWV0IQogICAgICovCi0gICAgCisKICAgICAvKgogICAgICogSWYgbm90IC0xLCB0aGVuIGNoMSB3aWxsIHBvaW50IHRvOgogICAgICogMSkgRm9yIHByZWRpY2F0ZXMgKFhQQVRIX09QX1BSRURJQ0FURSk6CkBAIC0xMTgyMSwxMyArMTE4NDksMTMgQEAKICAgICAqICAgIC0gYW4gaW5uZXIgZmlsdGVyIG9wZXJhdGVyIE9SCiAgICAgKiAgICAtIGFuIGV4cHJlc3Npb24gc2VsZWN0aW5nIHRoZSBub2RlIHNldC4KICAgICAqICAgICAgRS5nLiAia2V5KCdhJywgJ2InKSIgb3IgIigvL2ZvbyB8IC8vYmFyKSIuCi0gICAgKi8gICAgCisgICAgKi8KICAgICBpZiAoKG9wLT5vcCAhPSBYUEFUSF9PUF9QUkVESUNBVEUpICYmIChvcC0+b3AgIT0gWFBBVEhfT1BfRklMVEVSKSkKIAlyZXR1cm4oMCk7CiAKICAgICBpZiAob3AtPmNoMiAhPSAtMSkgewogCWV4cHJPcCA9ICZjdHh0LT5jb21wLT5zdGVwc1tvcC0+Y2gyXTsKLSAgICB9IGVsc2UJCisgICAgfSBlbHNlCiAJcmV0dXJuKDApOwogCiAgICAgaWYgKChleHByT3AgIT0gTlVMTCkgJiYKQEAgLTExODQ2LDEwICsxMTg3NCwxMCBAQAogCSogTWF5YmUgd2UgY291bGQgcmV3cml0ZSB0aGUgQVNUIHRvIGVhc2UgdGhlIG9wdGltaXphdGlvbi4KIAkqLwogCSptYXhQb3MgPSAoaW50KSAoKHhtbFhQYXRoT2JqZWN0UHRyKSBleHByT3AtPnZhbHVlNCktPmZsb2F0dmFsOwotCQorCiAJaWYgKCgoeG1sWFBhdGhPYmplY3RQdHIpIGV4cHJPcC0+dmFsdWU0KS0+ZmxvYXR2YWwgPT0KIAkgICAgKGZsb2F0KSAqbWF4UG9zKQotCXsJICAgIAorCXsKIAkgICAgcmV0dXJuKDEpOwogCX0KICAgICB9CkBAIC0xMTkxMCw3ICsxMTkzOCw3IEBACiAgICAgKiBVc2VkIHRvIGZlZWQgcHJlZGljYXRlIGV2YWx1YXRpb24uCiAgICAgKi8KICAgICB4bWxOb2RlU2V0UHRyIHNlcTsKLSAgICB4bWxOb2RlUHRyIGN1cjsgICAgCisgICAgeG1sTm9kZVB0ciBjdXI7CiAgICAgLyogRmlyc3QgcHJlZGljYXRlIG9wZXJhdG9yICovCiAgICAgeG1sWFBhdGhTdGVwT3BQdHIgcHJlZE9wOwogICAgIGludCBtYXhQb3M7IC8qIFRoZSByZXF1ZXN0ZWQgcG9zaXRpb24oKSAod2hlbiBhICJbbl0iIHByZWRpY2F0ZSkgKi8KQEAgLTExOTIyLDcgKzExOTUwLDcgQEAKICAgICB4bWxYUGF0aFRyYXZlcnNhbEZ1bmN0aW9uRXh0IG91dGVyTmV4dCA9IE5VTEw7CiAgICAgdm9pZCAoKmFkZE5vZGUpICh4bWxOb2RlU2V0UHRyLCB4bWxOb2RlUHRyKTsKICAgICB4bWxYUGF0aE5vZGVTZXRNZXJnZUZ1bmN0aW9uIG1lcmdlQW5kQ2xlYXI7Ci0gICAgeG1sTm9kZVB0ciBvbGRDb250ZXh0Tm9kZTsgICAgCisgICAgeG1sTm9kZVB0ciBvbGRDb250ZXh0Tm9kZTsKICAgICB4bWxYUGF0aENvbnRleHRQdHIgeHBjdHh0ID0gY3R4dC0+Y29udGV4dDsKIAogCkBAIC0xMTkzNyw3ICsxMTk2NSw3IEBACiAJICAgIHhtbFhQYXRoUmVsZWFzZU9iamVjdCh4cGN0eHQsIG9iaik7CiAgICAgICAgICAgICBYUF9FUlJPUjAoWFBBVEhfVU5ERUZfUFJFRklYX0VSUk9SKTsKIAl9Ci0gICAgfSAgICAKKyAgICB9CiAgICAgLyoKICAgICAqIFNldHVwIGF4aXMuCiAgICAgKgpAQCAtMTE5NzUsOCArMTIwMDMsOCBAQAogCQkqIFRoaXMgaXRlcmF0b3Igd2lsbCBnaXZlIHVzIG9ubHkgbm9kZXMgd2hpY2ggY2FuCiAJCSogaG9sZCBlbGVtZW50IG5vZGVzLgogCQkqLwotCQlvdXRlck5leHQgPSB4bWxYUGF0aE5leHREZXNjZW5kYW50T3JTZWxmRWxlbVBhcmVudDsJCQotCSAgICB9CSAgICAKKwkJb3V0ZXJOZXh0ID0geG1sWFBhdGhOZXh0RGVzY2VuZGFudE9yU2VsZkVsZW1QYXJlbnQ7CisJICAgIH0KIAkgICAgaWYgKCgodGVzdCA9PSBOT0RFX1RFU1RfTkFNRSkgfHwgKHRlc3QgPT0gTk9ERV9URVNUX0FMTCkpICYmCiAJCSh0eXBlID09IE5PREVfVFlQRV9OT0RFKSkKIAkgICAgewpAQCAtMTIwMzEsMjAgKzEyMDU5LDIwIEBACiAgICAgfQogCiAjaWZkZWYgREVCVUdfU1RFUAotICAgIHhtbFhQYXRoRGVidWdEdW1wU3RlcEF4aXMoYXhpcywgdGVzdCwKLQkob2JqLT5ub2Rlc2V0dmFsICE9IE5VTEwpID8gb2JqLT5ub2RzZXR2YWwtPm5vZGVOciA6IDApOworICAgIHhtbFhQYXRoRGVidWdEdW1wU3RlcEF4aXMob3AsCisJKG9iai0+bm9kZXNldHZhbCAhPSBOVUxMKSA/IG9iai0+bm9kZXNldHZhbC0+bm9kZU5yIDogMCk7CiAjZW5kaWYKIAogICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLQl4bWxYUGF0aFJlbGVhc2VPYmplY3QoeHBjdHh0LCBvYmopOyAKKwl4bWxYUGF0aFJlbGVhc2VPYmplY3QoeHBjdHh0LCBvYmopOwogICAgICAgICByZXR1cm4oMCk7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgY29udGV4dFNlcSA9IG9iai0+bm9kZXNldHZhbDsKICAgICBpZiAoKGNvbnRleHRTZXEgPT0gTlVMTCkgfHwgKGNvbnRleHRTZXEtPm5vZGVOciA8PSAwKSkgewogCXhtbFhQYXRoUmVsZWFzZU9iamVjdCh4cGN0eHQsIG9iaik7CiAgICAgICAgIHZhbHVlUHVzaChjdHh0LCB4bWxYUGF0aENhY2hlV3JhcE5vZGVTZXQoeHBjdHh0LCBOVUxMKSk7CiAgICAgICAgIHJldHVybigwKTsKLSAgICB9ICAgCisgICAgfQogICAgIC8qCiAgICAgKiBQcmVkaWNhdGUgb3B0aW1pemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogSWYgdGhpcyBzdGVwIGhhcyBhIGxhc3QgcHJlZGljYXRlLCB3aGljaCBjb250YWlucyBhIHBvc2l0aW9uKCksCkBAIC0xMjA1Miw3ICsxMjA4MCw3IEBACiAgICAgKiB0aGUgIHNob3J0LWhhbmQgZm9ybSwgaS5lLiwgIltuXSIuCiAgICAgKgogICAgICogRXhhbXBsZSAtIGV4cHJlc3Npb24gIi9mb29bcGFyZW50OjpiYXJdWzFdIjoKLSAgICAqICAKKyAgICAqCiAgICAgKiBDT0xMRUNUICdjaGlsZCcgJ25hbWUnICdub2RlJyBmb28gICAgLS0gb3AgKHdlIGFyZSBoZXJlKQogICAgICogICBST09UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIG9wLT5jaDEKICAgICAqICAgUFJFRElDQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBvcC0+Y2gyIChwcmVkT3ApCkBAIC0xMjA4NSw3ICsxMjExMyw3IEBACiAJCSovCiAJCXByZWRPcCA9IE5VTEw7CiAJCWhhc0F4aXNSYW5nZSA9IDE7Ci0JICAgIH0JICAgIAorCSAgICB9CiAJfQogICAgIH0KICAgICBicmVha09uRmlyc3RIaXQgPSAoKHRvQm9vbCkgJiYgKHByZWRPcCA9PSBOVUxMKSkgPyAxIDogMDsKQEAgLTEyMDk0LDcgKzEyMTIyLDcgQEAKICAgICAqLwogICAgIC8qCiAgICAgICogMi4zIE5vZGUgVGVzdHMKLSAgICAgKiAgLSBGb3IgdGhlIGF0dHJpYnV0ZSBheGlzLCB0aGUgcHJpbmNpcGFsIG5vZGUgdHlwZSBpcyBhdHRyaWJ1dGUuIAorICAgICAqICAtIEZvciB0aGUgYXR0cmlidXRlIGF4aXMsIHRoZSBwcmluY2lwYWwgbm9kZSB0eXBlIGlzIGF0dHJpYnV0ZS4KICAgICAgKiAgLSBGb3IgdGhlIG5hbWVzcGFjZSBheGlzLCB0aGUgcHJpbmNpcGFsIG5vZGUgdHlwZSBpcyBuYW1lc3BhY2UuCiAgICAgICogIC0gRm9yIG90aGVyIGF4ZXMsIHRoZSBwcmluY2lwYWwgbm9kZSB0eXBlIGlzIGVsZW1lbnQuCiAgICAgICoKQEAgLTEyMTMxLDggKzEyMTU5LDggQEAKIAkgICAgKi8KIAkgICAgeHBjdHh0LT5ub2RlID0gY29udGV4dE5vZGU7CiAJfSBlbHNlCi0JICAgIHhwY3R4dC0+bm9kZSA9IGNvbnRleHRTZXEtPm5vZGVUYWJbY29udGV4dElkeCsrXTsJCi0gICAgICAgIAorCSAgICB4cGN0eHQtPm5vZGUgPSBjb250ZXh0U2VxLT5ub2RlVGFiW2NvbnRleHRJZHgrK107CisKIAlpZiAoc2VxID09IE5VTEwpIHsKIAkgICAgc2VxID0geG1sWFBhdGhOb2RlU2V0Q3JlYXRlKE5VTEwpOwogCSAgICBpZiAoc2VxID09IE5VTEwpIHsKQEAgLTEyMTg2LDcgKzEyMjE0LDcgQEAKICNpZmRlZiBERUJVR19TVEVQCiAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwgIiAlcyIsIGN1ci0+bmFtZSk7CiAjZW5kaWYKLSAgICAgICAgICAgIAorCiAJICAgIHN3aXRjaCAodGVzdCkgewogICAgICAgICAgICAgICAgIGNhc2UgTk9ERV9URVNUX05PTkU6CiAJCSAgICB0b3RhbCA9IDA7CkBAIC0xMjIwNSw3ICsxMjIzMyw3IEBACiAjaWZkZWYgTElCWE1MX0RPQ0JfRU5BQkxFRAogCQkJICAgIGNhc2UgWE1MX0RPQ0JfRE9DVU1FTlRfTk9ERToKICNlbmRpZgotCQkJICAgIGNhc2UgWE1MX0VMRU1FTlRfTk9ERToJCQkgICAgCisJCQkgICAgY2FzZSBYTUxfRUxFTUVOVF9OT0RFOgogCQkJICAgIGNhc2UgWE1MX0FUVFJJQlVURV9OT0RFOgogCQkJICAgIGNhc2UgWE1MX1BJX05PREU6CiAJCQkgICAgY2FzZSBYTUxfQ09NTUVOVF9OT0RFOgpAQCAtMTIzMzMsNyArMTIzNjEsNyBAQAogCiAJZ290byBhcHBseV9wcmVkaWNhdGVzOwogCi1heGlzX3JhbmdlX2VuZDogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8JCitheGlzX3JhbmdlX2VuZDogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAkvKgogCSogV2UgaGF2ZSBhICIvZm9vW25dIiwgYW5kIHBvc2l0aW9uKCkgPSBuIHdhcyByZWFjaGVkLgogCSogTm90ZSB0aGF0IHdlIGNhbiBoYXZlIGFzIHdlbGwgIi9mb28vOjpwYXJlbnQ6OmZvb1sxXSIsIHNvCkBAIC0xMjM3MiwxMSArMTI0MDAsMTEgQEAKIGFwcGx5X3ByZWRpY2F0ZXM6IC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAvKgogCSogQXBwbHkgcHJlZGljYXRlcy4KLQkqLwkKKwkqLwogICAgICAgICBpZiAoKHByZWRPcCAhPSBOVUxMKSAmJiAoc2VxLT5ub2RlTnIgPiAwKSkgewogCSAgICAvKgogCSAgICAqIEUuZy4gd2hlbiB3ZSBoYXZlIGEgIi9mb29bc29tZSBleHByZXNzaW9uXVtuXSIuCi0JICAgICovCSAgICAJICAgIAorCSAgICAqLwkgICAgCiAJICAgIC8qCiAJICAgICogUVVFU1RJT04gVE9ETzogVGhlIG9sZCBwcmVkaWNhdGUgZXZhbHVhdGlvbiB0b29rIGludG8KIAkgICAgKiAgYWNjb3VudCBsb2NhdGlvbi1zZXRzLgpAQCAtMTIzODUsNyArMTI0MTMsNyBAQAogCSAgICAqICBBbGwgd2hhdCBJIGxlYXJuZWQgbm93IGZyb20gdGhlIGV2YWx1YXRpb24gc2VtYW50aWNzCiAJICAgICogIGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBsb2NhdGlvbi1zZXQgd2lsbCBiZSBwcm9jZXNzZWQKIAkgICAgKiAgaGVyZSwgc28gdGhpcyBsb29rcyBPSy4KLQkgICAgKi8JICAgIAkgICAgCisJICAgICovCSAgICAKIAkgICAgLyoKIAkgICAgKiBJdGVyYXRlIG92ZXIgYWxsIHByZWRpY2F0ZXMsIHN0YXJ0aW5nIHdpdGggdGhlIG91dGVybW9zdAogCSAgICAqIHByZWRpY2F0ZS4KQEAgLTEyNDAxLDcgKzEyNDI5LDcgQEAKIAkgICAgKgogCSAgICAqIEZvciB0aGUgbW9tZW50LCBJJ2xsIHRyeSB0byBzb2x2ZSB0aGlzIHdpdGggYSByZWN1cnNpdmUKIAkgICAgKiBmdW5jdGlvbjogeG1sWFBhdGhDb21wT3BFdmFsUHJlZGljYXRlKCkuCi0JICAgICovCSAgICAKKwkgICAgKi8KIAkgICAgc2l6ZSA9IHNlcS0+bm9kZU5yOwogCSAgICBpZiAoaGFzUHJlZGljYXRlUmFuZ2UgIT0gMCkKIAkJbmV3U2l6ZSA9IHhtbFhQYXRoQ29tcE9wRXZhbFBvc2l0aW9uYWxQcmVkaWNhdGUoY3R4dCwKQEAgLTEyNDU2LDcgKzEyNDg0LDcgQEAKIAkgICAgfSBlbHNlIHsKIAkJb3V0U2VxID0gbWVyZ2VBbmRDbGVhcihvdXRTZXEsIHNlcSwgMCk7CiAJICAgIH0KLQl9CQorCX0KICAgICB9CiAKIGVycm9yOgpAQCAtMTI0ODEsMTAgKzEyNTA5LDExIEBACiAJICAgIG91dFNlcSA9IHNlcTsKIAllbHNlCiAJICAgIG91dFNlcSA9IHhtbFhQYXRoTm9kZVNldENyZWF0ZShOVUxMKTsKKyAgICAgICAgLyogWFhYIHdoYXQgaWYgeG1sWFBhdGhOb2RlU2V0Q3JlYXRlIHJldHVybmVkIE5VTEwgaGVyZT8gKi8KICAgICB9CiAgICAgaWYgKChzZXEgIT0gTlVMTCkgJiYgKHNlcSAhPSBvdXRTZXEpKSB7CiAJIHhtbFhQYXRoRnJlZU5vZGVTZXQoc2VxKTsKLSAgICB9ICAgIAorICAgIH0KICAgICAvKgogICAgICogSGFuZCBvdmVyIHRoZSByZXN1bHQuIEJldHRlciB0byBwdXNoIHRoZSBzZXQgYWxzbyBpbgogICAgICogY2FzZSBvZiBlcnJvcnMuCkBAIC0xMjc2OCw5ICsxMjc5Nyw5IEBACiAJCQkgICAgICB4bWxYUGF0aFN0ZXBPcFB0ciBvcCwgeG1sTm9kZVB0ciAqIGZpcnN0KQogewogICAgIGludCB0b3RhbCA9IDA7Ci0gICAgeG1sWFBhdGhDb21wRXhwclB0ciBjb21wOyAgICAKKyAgICB4bWxYUGF0aENvbXBFeHByUHRyIGNvbXA7CiAgICAgeG1sWFBhdGhPYmplY3RQdHIgcmVzOwotICAgIHhtbFhQYXRoT2JqZWN0UHRyIG9iajsgICAgCisgICAgeG1sWFBhdGhPYmplY3RQdHIgb2JqOwogICAgIHhtbE5vZGVTZXRQdHIgb2xkc2V0OwogICAgIHhtbE5vZGVQdHIgb2xkbm9kZTsKICAgICB4bWxEb2NQdHIgb2xkRG9jOwpAQCAtMTI3ODUsNyArMTI4MTQsNyBAQAogCShjb21wLT5zdGVwc1tvcC0+Y2gxXS5vcCA9PSBYUEFUSF9PUF9TT1JUKSAmJgogCShjb21wLT5zdGVwc1tvcC0+Y2gyXS5vcCA9PSBYUEFUSF9PUF9TT1JUKSkgewogCWludCBmID0gY29tcC0+c3RlcHNbb3AtPmNoMl0uY2gxOwotCQorCiAJaWYgKChmICE9IC0xKSAmJgogCSAgICAoY29tcC0+c3RlcHNbZl0ub3AgPT0gWFBBVEhfT1BfRlVOQ1RJT04pICYmCiAJICAgIChjb21wLT5zdGVwc1tmXS52YWx1ZTUgPT0gTlVMTCkgJiYKQEAgLTEyNzk0LDcgKzEyODIzLDcgQEAKIAkgICAgKHhtbFN0ckVxdWFsCiAJICAgIChjb21wLT5zdGVwc1tmXS52YWx1ZTQsIEJBRF9DQVNUICJsYXN0IikpKSB7CiAJICAgIHhtbE5vZGVQdHIgbGFzdCA9IE5VTEw7Ci0JICAgIAorCiAJICAgIHRvdGFsICs9CiAJCXhtbFhQYXRoQ29tcE9wRXZhbExhc3QoY3R4dCwKIAkJICAgICZjb21wLT5zdGVwc1tvcC0+Y2gxXSwKQEAgLTEyODIxLDcgKzEyODUwLDcgQEAKIAkgICAgcmV0dXJuICh0b3RhbCk7CiAJfQogICAgIH0KLSAgICAKKwogICAgIGlmIChvcC0+Y2gxICE9IC0xKQogCXRvdGFsICs9IHhtbFhQYXRoQ29tcE9wRXZhbChjdHh0LCAmY29tcC0+c3RlcHNbb3AtPmNoMV0pOwogICAgIENIRUNLX0VSUk9SMDsKQEAgLTEyODI5LDcgKzEyODU4LDcgQEAKIAlyZXR1cm4gKHRvdGFsKTsKICAgICBpZiAoY3R4dC0+dmFsdWUgPT0gTlVMTCkKIAlyZXR1cm4gKHRvdGFsKTsKLSAgICAKKwogI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKICAgICBvbGRub2RlID0gY3R4dC0+Y29udGV4dC0+bm9kZTsKICAgICAvKgpAQCAtMTI4MzksNyArMTI4NjgsNyBAQAogCXhtbFhQYXRoT2JqZWN0UHRyIHRtcCA9IE5VTEw7CiAJeG1sTG9jYXRpb25TZXRQdHIgbmV3bG9jc2V0ID0gTlVMTDsKIAl4bWxMb2NhdGlvblNldFB0ciBvbGRsb2NzZXQ7Ci0JCisKIAkvKgogCSogRXh0cmFjdCB0aGUgb2xkIGxvY3NldCwgYW5kIHRoZW4gZXZhbHVhdGUgdGhlIHJlc3VsdCBvZiB0aGUKIAkqIGV4cHJlc3Npb24gZm9yIGFsbCB0aGUgZWxlbWVudCBpbiB0aGUgbG9jc2V0LiB1c2UgaXQgdG8gZ3JvdwpAQCAtMTI4NDksNyArMTI4NzgsNyBAQAogCW9iaiA9IHZhbHVlUG9wKGN0eHQpOwogCW9sZGxvY3NldCA9IG9iai0+dXNlcjsKIAljdHh0LT5jb250ZXh0LT5ub2RlID0gTlVMTDsKLQkKKwogCWlmICgob2xkbG9jc2V0ID09IE5VTEwpIHx8IChvbGRsb2NzZXQtPmxvY05yID09IDApKSB7CiAJICAgIGN0eHQtPmNvbnRleHQtPmNvbnRleHRTaXplID0gMDsKIAkgICAgY3R4dC0+Y29udGV4dC0+cHJveGltaXR5UG9zaXRpb24gPSAwOwpAQCAtMTI4NjQsNyArMTI4OTMsNyBAQAogCSAgICByZXR1cm4gKHRvdGFsKTsKIAl9CiAJbmV3bG9jc2V0ID0geG1sWFB0ckxvY2F0aW9uU2V0Q3JlYXRlKE5VTEwpOwotCQorCiAJZm9yIChpID0gMDsgaSA8IG9sZGxvY3NldC0+bG9jTnI7IGkrKykgewogCSAgICAvKgogCSAgICAqIFJ1biB0aGUgZXZhbHVhdGlvbiB3aXRoIGEgbm9kZSBsaXN0IG1hZGUgb2YgYQpAQCAtMTI4NzksNyArMTI5MDgsNyBAQAogCSAgICB9IGVsc2UgewogCQl4bWxYUGF0aE5vZGVTZXRBZGRVbmlxdWUodG1wLT5ub2Rlc2V0dmFsLAogCQkgICAgY3R4dC0+Y29udGV4dC0+bm9kZSk7Ci0JICAgIH0JICAgIAorCSAgICB9CiAJICAgIHZhbHVlUHVzaChjdHh0LCB0bXApOwogCSAgICBpZiAob3AtPmNoMiAhPSAtMSkKIAkJdG90YWwgKz0geG1sWFBhdGhDb21wT3BFdmFsKGN0eHQsICZjb21wLT5zdGVwc1tvcC0+Y2gyXSk7CkBAIC0xMjkwNSwxNCArMTI5MzQsMTQgQEAKIAkgICAgfQogCSAgICBpZiAoY3R4dC0+dmFsdWUgPT0gdG1wKSB7CiAJCXZhbHVlUG9wKGN0eHQpOwotCQl4bWxYUGF0aE5vZGVTZXRDbGVhcih0bXAtPm5vZGVzZXR2YWwsIDEpOwkJCisJCXhtbFhQYXRoTm9kZVNldENsZWFyKHRtcC0+bm9kZXNldHZhbCwgMSk7CiAJCS8qCiAJCSogUkVWSVNJVCBUT0RPOiBEb24ndCBjcmVhdGUgYSB0ZW1wb3Jhcnkgbm9kZXNldAogCQkqIGZvciBldmVybHkgaXRlcmF0aW9uLgogCQkqLwogCQkvKiBPTEQ6IHhtbFhQYXRoRnJlZU9iamVjdChyZXMpOyAqLwogCSAgICB9IGVsc2UKLQkJdG1wID0gTlVMTDsJICAgIAorCQl0bXAgPSBOVUxMOwogCSAgICBjdHh0LT5jb250ZXh0LT5ub2RlID0gTlVMTDsKIAkgICAgLyoKIAkgICAgKiBPbmx5IHB1dCB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgcmVzdWx0LCB0aGVuIGxlYXZlLgpAQCAtMTI5MzcsNyArMTI5NjYsNyBAQAogCXJldHVybiAodG90YWwpOwogICAgIH0KICNlbmRpZiAvKiBMSUJYTUxfWFBUUl9FTkFCTEVEICovCi0gICAgCisKICAgICAvKgogICAgICogRXh0cmFjdCB0aGUgb2xkIHNldCwgYW5kIHRoZW4gZXZhbHVhdGUgdGhlIHJlc3VsdCBvZiB0aGUKICAgICAqIGV4cHJlc3Npb24gZm9yIGFsbCB0aGUgZWxlbWVudCBpbiB0aGUgc2V0LiB1c2UgaXQgdG8gZ3JvdwpAQCAtMTI5NDYsMTEgKzEyOTc1LDExIEBACiAgICAgQ0hFQ0tfVFlQRTAoWFBBVEhfTk9ERVNFVCk7CiAgICAgb2JqID0gdmFsdWVQb3AoY3R4dCk7CiAgICAgb2xkc2V0ID0gb2JqLT5ub2Rlc2V0dmFsOwotICAgIAorCiAgICAgb2xkbm9kZSA9IGN0eHQtPmNvbnRleHQtPm5vZGU7CiAgICAgb2xkRG9jID0gY3R4dC0+Y29udGV4dC0+ZG9jOwogICAgIGN0eHQtPmNvbnRleHQtPm5vZGUgPSBOVUxMOwotICAgIAorCiAgICAgaWYgKChvbGRzZXQgPT0gTlVMTCkgfHwgKG9sZHNldC0+bm9kZU5yID09IDApKSB7CiAJY3R4dC0+Y29udGV4dC0+Y29udGV4dFNpemUgPSAwOwogCWN0eHQtPmNvbnRleHQtPnByb3hpbWl0eVBvc2l0aW9uID0gMDsKQEAgLTEyOTc0LDkgKzEzMDAzLDEwIEBACiAJKiBJbml0aWFsaXplIHRoZSBuZXcgc2V0LgogCSogQWxzbyBzZXQgdGhlIHhwYXRoIGRvY3VtZW50IGluIGNhc2UgdGhpbmdzIGxpa2UKIAkqIGtleSgpIGV2YWx1YXRpb24gYXJlIGF0dGVtcHRlZCBvbiB0aGUgcHJlZGljYXRlCi0JKi8JCisJKi8KIAluZXdzZXQgPSB4bWxYUGF0aE5vZGVTZXRDcmVhdGUoTlVMTCk7Ci0JCisgICAgICAgIC8qIFhYWCB3aGF0IGlmIHhtbFhQYXRoTm9kZVNldENyZWF0ZSByZXR1cm5lZCBOVUxMPyAqLworCiAJZm9yIChpID0gMDsgaSA8IG9sZHNldC0+bm9kZU5yOyBpKyspIHsKIAkgICAgLyoKIAkgICAgKiBSdW4gdGhlIGV2YWx1YXRpb24gd2l0aCBhIG5vZGUgbGlzdCBtYWRlIG9mCkBAIC0xMzAwMiw3ICsxMzAzMiw3IEBACiAJCXhtbFhQYXRoRnJlZU5vZGVTZXQobmV3c2V0KTsKIAkJeG1sWFBhdGhGcmVlT2JqZWN0KG9iaik7CiAJCXJldHVybigwKTsKLQkgICAgfQkgICAgCisJICAgIH0KIAkgICAgLyoKIAkgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG5lZWRzIHRvIGJlIHRlc3RlZCB0bwogCSAgICAqIGRlY2lkZSB3aGV0aGVyIHRoZSBmaWx0ZXIgc3VjY2VlZGVkIG9yIG5vdApAQCAtMTMwMTAsNyArMTMwNDAsNyBAQAogCSAgICByZXMgPSB2YWx1ZVBvcChjdHh0KTsKIAkgICAgaWYgKHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoY3R4dCwgcmVzKSkgewogCQl4bWxYUGF0aE5vZGVTZXRBZGQobmV3c2V0LCBvbGRzZXQtPm5vZGVUYWJbaV0pOwotCSAgICB9CSAgICAKKwkgICAgfQogCSAgICAvKgogCSAgICAqIENsZWFudXAKIAkgICAgKi8KQEAgLTEzMTQ2LDcgKzEzMTc2LDcgQEAKICAgICAgICAgICAgIHRvdGFsICs9IHhtbFhQYXRoQ29tcE9wRXZhbChjdHh0LCAmY29tcC0+c3RlcHNbb3AtPmNoMl0pOwogCSAgICBDSEVDS19FUlJPUjA7CiAJICAgIGlmIChvcC0+dmFsdWUpCi0gICAgICAgIAllcXVhbCA9IHhtbFhQYXRoRXF1YWxWYWx1ZXMoY3R4dCk7CisJCWVxdWFsID0geG1sWFBhdGhFcXVhbFZhbHVlcyhjdHh0KTsKIAkgICAgZWxzZQogCQllcXVhbCA9IHhtbFhQYXRoTm90RXF1YWxWYWx1ZXMoY3R4dCk7CiAJICAgIHZhbHVlUHVzaChjdHh0LCB4bWxYUGF0aENhY2hlTmV3Qm9vbGVhbihjdHh0LT5jb250ZXh0LCBlcXVhbCkpOwpAQCAtMTMyOTksOCArMTMzMjksOCBAQAogICAgICAgICAgICAgICAgICAgICBVUkkgPSB4bWxYUGF0aE5zTG9va3VwKGN0eHQtPmNvbnRleHQsIG9wLT52YWx1ZTUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoVVJJID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxYUGF0aENvbXBPcEV2YWw6IHZhcmlhYmxlICVzIGJvdW5kIHRvIHVuZGVmaW5lZCBwcmVmaXggJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnZhbHVlNCwgb3AtPnZhbHVlNSk7CisgICAgICAgICAgICAieG1sWFBhdGhDb21wT3BFdmFsOiB2YXJpYWJsZSAlcyBib3VuZCB0byB1bmRlZmluZWQgcHJlZml4ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgb3AtPnZhbHVlNCwgKGNoYXIgKilvcC0+dmFsdWU1KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG90YWwpOwogICAgICAgICAgICAgICAgICAgICB9CiAJCSAgICB2YWwgPSB4bWxYUGF0aFZhcmlhYmxlTG9va3VwTlMoY3R4dC0+Y29udGV4dCwKQEAgLTEzMzQ3LDggKzEzMzc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFVSSSA9IHhtbFhQYXRoTnNMb29rdXAoY3R4dC0+Y29udGV4dCwgb3AtPnZhbHVlNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVJJID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhtbFhQYXRoQ29tcE9wRXZhbDogZnVuY3Rpb24gJXMgYm91bmQgdG8gdW5kZWZpbmVkIHByZWZpeCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPnZhbHVlNCwgb3AtPnZhbHVlNSk7CisgICAgICAgICAgICAieG1sWFBhdGhDb21wT3BFdmFsOiBmdW5jdGlvbiAlcyBib3VuZCB0byB1bmRlZmluZWQgcHJlZml4ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilvcC0+dmFsdWU0LCAoY2hhciAqKW9wLT52YWx1ZTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG90YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHhtbFhQYXRoRnVuY3Rpb25Mb29rdXBOUyhjdHh0LT5jb250ZXh0LApAQCAtMTMzNTYsOCArMTMzODYsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxYUGF0aENvbXBPcEV2YWw6IGZ1bmN0aW9uICVzIG5vdCBmb3VuZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dmFsdWU0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhtbFhQYXRoQ29tcE9wRXZhbDogZnVuY3Rpb24gJXMgbm90IGZvdW5kXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopb3AtPnZhbHVlNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBYUF9FUlJPUjAoWFBBVEhfVU5LTk9XTl9GVU5DX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBvcC0+Y2FjaGUgPSBYTUxfQ0FTVF9GUFRSKGZ1bmMpOwpAQCAtMTM1NTUsNyArMTM1ODUsNyBAQAogCQkJdG1wID0geG1sWFBhdGhDYWNoZU5ld05vZGVTZXQoY3R4dC0+Y29udGV4dCwKIAkJCSAgICBjdHh0LT5jb250ZXh0LT5ub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUHVzaChjdHh0LCB0bXApOwotCQkJCisKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcC0+Y2gyICE9IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFhQYXRoQ29tcE9wRXZhbChjdHh0LApAQCAtMTM2NjQsNyArMTM2OTQsNyBAQAogCQkgICAgKiAgICBuQyAgICAgICAgIDIKIAkJICAgICoKIAkJICAgICogcmVtb3ZlZCB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgbm9kZS1zZXQsIHRoZW4KLQkJICAgICogdGhlIGNvbnRleHQgcG9zaXRpb24gb2YgdGhlIAorCQkgICAgKiB0aGUgY29udGV4dCBwb3NpdGlvbiBvZiB0aGUKIAkJICAgICovCiAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRzZXQtPm5vZGVOcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTM3MjEsNyArMTM3NTEsNyBAQAogCQkJfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eHQtPnZhbHVlID09IHRtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUG9wKGN0eHQpOwotCQkJICAgIHhtbFhQYXRoTm9kZVNldENsZWFyKHRtcC0+bm9kZXNldHZhbCwgMSk7CQkJICAgIAorCQkJICAgIHhtbFhQYXRoTm9kZVNldENsZWFyKHRtcC0+bm9kZXNldHZhbCwgMSk7CiAJCQkgICAgLyoKIAkJCSAgICAqIERvbid0IGZyZWUgdGhlIHRlbXBvcmFyeSBub2Rlc2V0CiAJCQkgICAgKiBpbiBvcmRlciB0byBhdm9pZCBtYXNzaXZlIHJlY3JlYXRpb24gaW5zaWRlIHRoaXMKQEAgLTEzODI0LDcgKzEzODU0LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsdWVQb3AoY3R4dCk7CiAJCQlpZiAocmVzLT50eXBlID09IFhQQVRIX0xPQ0FUSU9OU0VUKSB7Ci0JCQkgICAgeG1sTG9jYXRpb25TZXRQdHIgcmxvYyA9IAorCQkJICAgIHhtbExvY2F0aW9uU2V0UHRyIHJsb2MgPQogCQkJICAgICAgICAoeG1sTG9jYXRpb25TZXRQdHIpcmVzLT51c2VyOwogCQkJICAgIGZvciAoaj0wOyBqPHJsb2MtPmxvY05yOyBqKyspIHsKIAkJCSAgICAgICAgcmFuZ2UgPSB4bWxYUHRyTmV3UmFuZ2UoCkBAIC0xMzk4Niw3ICsxNDAxNiw3IEBACiAJICAgIHhtbFhQYXRoQ29tcE9wRXZhbChjdHh0LCBvcCk7CiAJICAgIGlmIChjdHh0LT5lcnJvciAhPSBYUEFUSF9FWFBSRVNTSU9OX09LKQogCQlyZXR1cm4oLTEpOwotCSAgICAKKwogCSAgICByZXNPYmogPSB2YWx1ZVBvcChjdHh0KTsKIAkgICAgaWYgKHJlc09iaiA9PSBOVUxMKQogCQlyZXR1cm4oLTEpOwpAQCAtMTQwMDcsNyArMTQwMzcsNyBAQAogCSAgICAqICB0byB0cnVlIGlmIHRoZSBudW1iZXIgaXMgZXF1YWwgdG8gdGhlIGNvbnRleHQgcG9zaXRpb24KIAkgICAgKiAgYW5kIHdpbGwgYmUgY29udmVydGVkIHRvIGZhbHNlIG90aGVyd2lzZTsiCiAJICAgICovCi0JICAgIHJlcyA9IHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoY3R4dCwgcmVzT2JqKTsgCisJICAgIHJlcyA9IHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoY3R4dCwgcmVzT2JqKTsKIAl9IGVsc2UgewogCSAgICByZXMgPSB4bWxYUGF0aENhc3RUb0Jvb2xlYW4ocmVzT2JqKTsKIAl9CkBAIC0xNDAzMCwxMyArMTQwNjAsMTMgQEAKIAkJICAgICAgeG1sWFBhdGhPYmplY3RQdHIgKnJlc3VsdFNlcSwgaW50IHRvQm9vbCkKIHsKICAgICBpbnQgbWF4X2RlcHRoLCBtaW5fZGVwdGg7Ci0gICAgaW50IGZyb21fcm9vdDsgICAgCisgICAgaW50IGZyb21fcm9vdDsKICAgICBpbnQgcmV0LCBkZXB0aDsKICAgICBpbnQgZXZhbF9hbGxfbm9kZXM7CiAgICAgeG1sTm9kZVB0ciBjdXIgPSBOVUxMLCBsaW1pdCA9IE5VTEw7CiAgICAgeG1sU3RyZWFtQ3R4dFB0ciBwYXRzdHJlYW0gPSBOVUxMOwotICAgIAotICAgIGludCBuYl9ub2RlcyA9IDA7ICAgIAorCisgICAgaW50IG5iX25vZGVzID0gMDsKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoY29tcCA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuKC0xKTsKQEAgLTE0MDYyLDcgKzE0MDkyLDcgQEAKIAlpZiAoKnJlc3VsdFNlcSA9PSBOVUxMKQogCSAgICByZXR1cm4oLTEpOwogICAgIH0KLSAgICAKKwogICAgIC8qCiAgICAgICogaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2VzIG9mICIvIiBhbWQgIi4iIGJlaW5nIG1hdGNoZWQKICAgICAgKi8KQEAgLTE0MTU5LDcgKzE0MTg5LDcgQEAKIAkJICAgIHJldCA9IHhtbFN0cmVhbVB1c2hOb2RlKHBhdHN0cmVhbSwgTlVMTCwgTlVMTCwgY3VyLT50eXBlKTsKIAkJZWxzZQogCQkgICAgYnJlYWs7Ci0JCQorCiAJCWlmIChyZXQgPCAwKSB7CiAJCSAgICAvKiBOT1AuICovCiAJCX0gZWxzZSBpZiAocmV0ID09IDEpIHsKQEAgLTE0MTgzLDcgKzE0MjEzLDcgQEAKIHNjYW5fY2hpbGRyZW46CiAJaWYgKChjdXItPmNoaWxkcmVuICE9IE5VTEwpICYmIChkZXB0aCA8IG1heF9kZXB0aCkpIHsKIAkgICAgLyoKLQkgICAgICogRG8gbm90IGRlc2NlbmQgb24gZW50aXRpZXMgZGVjbGFyYXRpb25zCSAgICAgCisJICAgICAqIERvIG5vdCBkZXNjZW5kIG9uIGVudGl0aWVzIGRlY2xhcmF0aW9ucwogCSAgICAgKi8KIAkgICAgaWYgKGN1ci0+Y2hpbGRyZW4tPnR5cGUgIT0gWE1MX0VOVElUWV9ERUNMKSB7CiAJCWN1ciA9IGN1ci0+Y2hpbGRyZW47CkBAIC0xNDIwNSw3ICsxNDIzNSw3IEBACiAJCShjdXItPnR5cGUgIT0gWE1MX0RURF9OT0RFKSkKIAkJZ290byBuZXh0X25vZGU7CiAJfQotCQorCiAJZG8gewogCSAgICBjdXIgPSBjdXItPnBhcmVudDsKIAkgICAgZGVwdGgtLTsKQEAgLTE0MjY0LDcgKzE0Mjk0LDcgQEAKIAogICAgIGlmIChjdHh0LT52YWx1ZVRhYiA9PSBOVUxMKSB7CiAJLyogQWxsb2NhdGUgdGhlIHZhbHVlIHN0YWNrICovCi0JY3R4dC0+dmFsdWVUYWIgPSAoeG1sWFBhdGhPYmplY3RQdHIgKikgCisJY3R4dC0+dmFsdWVUYWIgPSAoeG1sWFBhdGhPYmplY3RQdHIgKikKIAkJCSB4bWxNYWxsb2MoMTAgKiBzaXplb2YoeG1sWFBhdGhPYmplY3RQdHIpKTsKIAlpZiAoY3R4dC0+dmFsdWVUYWIgPT0gTlVMTCkgewogCSAgICB4bWxYUGF0aFBFcnJNZW1vcnkoY3R4dCwgImNyZWF0aW5nIGV2YWx1YXRpb24gY29udGV4dFxuIik7CkBAIC0xNDI4Nyw3ICsxNDMxNyw3IEBACiAJICAgIGlmIChyZXMgIT0gLTEpCiAJCXJldHVybihyZXMpOwogCX0gZWxzZSB7Ci0JICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJlc09iaiA9IE5VTEw7CQorCSAgICB4bWxYUGF0aE9iamVjdFB0ciByZXNPYmogPSBOVUxMOwogCiAJICAgIC8qCiAJICAgICogRXZhbHVhdGlvbiB0byBhIHNlcXVlbmNlLgpAQCAtMTQzMDAsNyArMTQzMzAsNyBAQAogCQlyZXR1cm4oMCk7CiAJICAgIH0KIAkgICAgaWYgKHJlc09iaiAhPSBOVUxMKQotCQl4bWxYUGF0aFJlbGVhc2VPYmplY3QoY3R4dC0+Y29udGV4dCwgcmVzT2JqKTsJCisJCXhtbFhQYXRoUmVsZWFzZU9iamVjdChjdHh0LT5jb250ZXh0LCByZXNPYmopOwogCX0KIAkvKgogCSogUVVFU1RJT04gVE9ETzogVGhpcyBmYWxscyBiYWNrIHRvIG5vcm1hbCBYUGF0aCBldmFsdWF0aW9uCkBAIC0xNDMyNSw3ICsxNDM1NSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgotICogCQkJUHVibGljIGludGVyZmFjZXMJCQkJKgorICoJCQlQdWJsaWMgaW50ZXJmYWNlcwkJCQkqCiAgKgkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0MzQxLDcgKzE0MzcxLDcgQEAKICAqIGNvbnRleHQgbm9kZSBpbiB0aGUgY29udGV4dCBub2RlIGxpc3QgKGFzIHJldHVybmVkIGJ5IHRoZSBwb3NpdGlvbgogICogZnVuY3Rpb24pIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byBmYWxzZSBvdGhlcndpc2U7IGlmIHRoZSByZXN1bHQKICAqIGlzIG5vdCBhIG51bWJlciwgdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgY29udmVydGVkIGFzIGlmIGJ5IGEgY2FsbAotICogdG8gdGhlIGJvb2xlYW4gZnVuY3Rpb24uIAorICogdG8gdGhlIGJvb2xlYW4gZnVuY3Rpb24uCiAgKgogICogUmV0dXJucyAxIGlmIHByZWRpY2F0ZSBpcyB0cnVlLCAwIG90aGVyd2lzZQogICovCkBAIC0xNDM3OSwxMiArMTQ0MDksMTIgQEAKICAqIGNvbnRleHQgbm9kZSBpbiB0aGUgY29udGV4dCBub2RlIGxpc3QgKGFzIHJldHVybmVkIGJ5IHRoZSBwb3NpdGlvbgogICogZnVuY3Rpb24pIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byBmYWxzZSBvdGhlcndpc2U7IGlmIHRoZSByZXN1bHQKICAqIGlzIG5vdCBhIG51bWJlciwgdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgY29udmVydGVkIGFzIGlmIGJ5IGEgY2FsbAotICogdG8gdGhlIGJvb2xlYW4gZnVuY3Rpb24uIAorICogdG8gdGhlIGJvb2xlYW4gZnVuY3Rpb24uCiAgKgogICogUmV0dXJucyAxIGlmIHByZWRpY2F0ZSBpcyB0cnVlLCAwIG90aGVyd2lzZQogICovCiBpbnQKLXhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQsIAoreG1sWFBhdGhFdmFsdWF0ZVByZWRpY2F0ZVJlc3VsdCh4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sWFBhdGhPYmplY3RQdHIgcmVzKSB7CiAgICAgaWYgKChjdHh0ID09IE5VTEwpIHx8IChyZXMgPT0gTlVMTCkpIHJldHVybigwKTsKICAgICBzd2l0Y2ggKHJlcy0+dHlwZSkgewpAQCAtMTQ0NTcsNyArMTQ0ODcsNyBAQAogCXRtcCA9IHhtbFN0cmNocihzdHIsICc6Jyk7CiAJaWYgKCh0bXAgIT0gTlVMTCkgJiYKIAkgICAgKChjdHh0ID09IE5VTEwpIHx8IChjdHh0LT5uc05yID09IDApIHx8ICh0bXBbMV0gPT0gJzonKSkpCi0JICAgIHJldHVybihOVUxMKTsJICAgIAorCSAgICByZXR1cm4oTlVMTCk7CiAKIAlpZiAoY3R4dCAhPSBOVUxMKSB7CiAJICAgIGRpY3QgPSBjdHh0LT5kaWN0OwpAQCAtMTQ0ODEsNyArMTQ1MTEsNyBAQAogCQkJJm5hbWVzcGFjZXNbMF0pOwogCWlmIChuYW1lc3BhY2VzICE9IE5VTEwpIHsKIAkgICAgeG1sRnJlZSgoeG1sQ2hhciAqKiluYW1lc3BhY2VzKTsKLSAJfQorCX0KIAlpZiAoKHN0cmVhbSAhPSBOVUxMKSAmJiAoeG1sUGF0dGVyblN0cmVhbWFibGUoc3RyZWFtKSA9PSAxKSkgewogCSAgICBjb21wID0geG1sWFBhdGhOZXdDb21wRXhwcigpOwogCSAgICBpZiAoY29tcCA9PSBOVUxMKSB7CkBAIC0xNDUyMCwzMCArMTQ1NTAsMzAgQEAKICAgICAqLwogICAgIGlmIChvcC0+Y2gxICE9IC0xKSB7CiAJaWYgKChvcC0+b3AgPT0gWFBBVEhfT1BfQ09MTEVDVCAvKiAxMSAqLykgJiYKLQkgICAgKCh4bWxYUGF0aEF4aXNWYWwpIG9wLT52YWx1ZSA9PSBBWElTX0NISUxEIC8qIDQgKi8pICYmCSAgICAKKwkgICAgKCh4bWxYUGF0aEF4aXNWYWwpIG9wLT52YWx1ZSA9PSBBWElTX0NISUxEIC8qIDQgKi8pICYmCiAJICAgICgoeG1sWFBhdGhUZXN0VmFsKSBvcC0+dmFsdWUyID09IE5PREVfVEVTVF9OQU1FIC8qIDUgKi8pICYmCiAJICAgICgoeG1sWFBhdGhUeXBlVmFsKSBvcC0+dmFsdWUzID09IE5PREVfVFlQRV9OT0RFIC8qIDAgKi8pKQogCXsKIAkgICAgLyoKIAkgICAgKiBUaGlzIGlzIGEgImNoaWxkOjpmb28iCiAJICAgICovCi0JICAgIHhtbFhQYXRoU3RlcE9wUHRyIHByZXZvcCA9ICZjb21wLT5zdGVwc1tvcC0+Y2gxXTsJICAgIAorCSAgICB4bWxYUGF0aFN0ZXBPcFB0ciBwcmV2b3AgPSAmY29tcC0+c3RlcHNbb3AtPmNoMV07CiAKIAkgICAgaWYgKChwcmV2b3AtPm9wID09IFhQQVRIX09QX0NPTExFQ1QgLyogMTEgKi8pICYmCi0JCShwcmV2b3AtPmNoMSAhPSAtMSkgJiYJICAgIAorCQkocHJldm9wLT5jaDEgIT0gLTEpICYmCiAJCSgoeG1sWFBhdGhBeGlzVmFsKSBwcmV2b3AtPnZhbHVlID09CiAJCSAgICBBWElTX0RFU0NFTkRBTlRfT1JfU0VMRikgJiYKIAkJKHByZXZvcC0+Y2gyID09IC0xKSAmJgogCQkoKHhtbFhQYXRoVGVzdFZhbCkgcHJldm9wLT52YWx1ZTIgPT0gTk9ERV9URVNUX1RZUEUpICYmCiAJCSgoeG1sWFBhdGhUeXBlVmFsKSBwcmV2b3AtPnZhbHVlMyA9PSBOT0RFX1RZUEVfTk9ERSkgJiYKIAkJKGNvbXAtPnN0ZXBzW3ByZXZvcC0+Y2gxXS5vcCA9PSBYUEFUSF9PUF9ST09UKSkKLQkgICAgewkJCisJICAgIHsKIAkJLyoKIAkJKiBUaGlzIGlzIGEgIi9kZXNjZW5kYW50LW9yLXNlbGY6Om5vZGUoKSIgd2l0aG91dCBwcmVkaWNhdGVzLgogCQkqIEVsaW1pbmF0ZSBpdC4KIAkJKi8KIAkJb3AtPmNoMSA9IHByZXZvcC0+Y2gxOwotCQlvcC0+cmV3cml0ZVR5cGUgPSBYUF9SRVdSSVRFX0RPU19DSElMRF9FTEVNOwkJCisJCW9wLT5yZXdyaXRlVHlwZSA9IFhQX1JFV1JJVEVfRE9TX0NISUxEX0VMRU07CiAJICAgIH0KIAl9CiAJaWYgKG9wLT5jaDEgIT0gLTEpCkBAIC0xNDU4OCw3ICsxNDYxOCw3IEBACiAgICAgfQogCiAgICAgaWYgKCpwY3R4dC0+Y3VyICE9IDApIHsKLQkvKiAKKwkvKgogCSAqIGFsZWtzZXk6IGluIHNvbWUgY2FzZXMgdGhpcyBsaW5lIHByaW50cyAqc2Vjb25kKiBlcnJvciBtZXNzYWdlCiAJICogKHNlZSBidWcgIzc4ODU4KSBhbmQgcHJvYmFibHkgdGhpcyBzaG91bGQgYmUgZml4ZWQuCiAJICogSG93ZXZlciwgd2UgYXJlIG5vdCBzdXJlIHRoYXQgYWxsIGVycm9yIG1lc3NhZ2VzIGFyZSBwcmludGVkCkBAIC0xNDYwNyw3ICsxNDYzNyw3IEBACiAjaWZkZWYgREVCVUdfRVZBTF9DT1VOVFMKIAljb21wLT5zdHJpbmcgPSB4bWxTdHJkdXAoc3RyKTsKIAljb21wLT5uYiA9IDA7Ci0jZW5kaWYgIAorI2VuZGlmCiAJaWYgKChjb21wLT5leHByICE9IE5VTEwpICYmCiAJICAgIChjb21wLT5uYlN0ZXAgPiAyKSAmJgogCSAgICAoY29tcC0+bGFzdCA+PSAwKSAmJgpAQCAtMTQ2NTIsNyArMTQ2ODIsNyBAQAogCQkJICAgICB4bWxYUGF0aE9iamVjdFB0ciAqcmVzT2JqLAogCQkJICAgICBpbnQgdG9Cb29sKQogewotICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBwY3R4dDsgICAgCisgICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIHBjdHh0OwogI2lmbmRlZiBMSUJYTUxfVEhSRUFEX0VOQUJMRUQKICAgICBzdGF0aWMgaW50IHJlZW50YW5jZSA9IDA7CiAjZW5kaWYKQEAgLTE0NjgxLDE1ICsxNDcxMSwxNSBAQAogICAgIHJlcyA9IHhtbFhQYXRoUnVuRXZhbChwY3R4dCwgdG9Cb29sKTsKIAogICAgIGlmIChyZXNPYmopIHsKLQlpZiAocGN0eHQtPnZhbHVlID09IE5VTEwpIHsJICAgIAorCWlmIChwY3R4dC0+dmFsdWUgPT0gTlVMTCkgewogCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJInhtbFhQYXRoQ29tcGlsZWRFdmFsOiBldmFsdWF0aW9uIGZhaWxlZFxuIik7Ci0JICAgICpyZXNPYmogPSBOVUxMOwkgICAgCisJICAgICpyZXNPYmogPSBOVUxMOwogCX0gZWxzZSB7CiAJICAgICpyZXNPYmogPSB2YWx1ZVBvcChwY3R4dCk7CiAJfQogICAgIH0KLSAgICAKKwogICAgIC8qCiAgICAgKiBQb3AgYWxsIHJlbWFpbmluZyBvYmplY3RzIGZyb20gdGhlIHN0YWNrLgogICAgICovCkBAIC0xNDcwMCw3ICsxNDczMCw3IEBACiAJZG8gewogCSAgICB0bXAgPSB2YWx1ZVBvcChwY3R4dCk7CiAJICAgIGlmICh0bXAgIT0gTlVMTCkgewotCQlzdGFjaysrOyAKKwkJc3RhY2srKzsKIAkJeG1sWFBhdGhSZWxlYXNlT2JqZWN0KGN0eHQsIHRtcCk7CiAJICAgIH0KIAl9IHdoaWxlICh0bXAgIT0gTlVMTCk7CkBAIC0xNDcxMiwxMSArMTQ3NDIsMTEgQEAKIAkJc3RhY2spOwogCX0KICAgICB9Ci0gICAgCisKICAgICBpZiAoKHBjdHh0LT5lcnJvciAhPSBYUEFUSF9FWFBSRVNTSU9OX09LKSAmJiAocmVzT2JqKSAmJiAoKnJlc09iaikpIHsKIAl4bWxYUGF0aEZyZWVPYmplY3QoKnJlc09iaik7CiAJKnJlc09iaiA9IE5VTEw7Ci0gICAgfSAgICAgICAgCisgICAgfQogICAgIHBjdHh0LT5jb21wID0gTlVMTDsKICAgICB4bWxYUGF0aEZyZWVQYXJzZXJDb250ZXh0KHBjdHh0KTsKICNpZm5kZWYgTElCWE1MX1RIUkVBRF9FTkFCTEVECkBAIC0xNDc3Nyw3ICsxNDgwNyw3IEBACiAjZW5kaWYKIAogICAgIGlmIChjdHh0ID09IE5VTEwpIHJldHVybjsKLSAgICAKKwogI2lmZGVmIFhQQVRIX1NUUkVBTUlORwogICAgIGNvbXAgPSB4bWxYUGF0aFRyeVN0cmVhbUNvbXBpbGUoY3R4dC0+Y29udGV4dCwgY3R4dC0+YmFzZSk7CiAgICAgaWYgKGNvbXAgIT0gTlVMTCkgewpAQCAtMTQ4MDUsNyArMTQ4MzUsNyBAQAogCX0KICAgICB9CiAgICAgQ0hFQ0tfRVJST1I7Ci0gICAgeG1sWFBhdGhSdW5FdmFsKGN0eHQsIDApOyAgICAKKyAgICB4bWxYUGF0aFJ1bkV2YWwoY3R4dCwgMCk7CiB9CiAKIC8qKgpAQCAtMTQ4MzcsNyArMTQ4NjcsNyBAQAogCXhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCQkieG1sWFBhdGhFdmFsOiBldmFsdWF0aW9uIGZhaWxlZFxuIik7CiAJcmVzID0gTlVMTDsKLSAgICB9IGVsc2UgaWYgKCgqY3R4dC0+Y3VyICE9IDApICYmIChjdHh0LT5jb21wICE9IE5VTEwpIAorICAgIH0gZWxzZSBpZiAoKCpjdHh0LT5jdXIgIT0gMCkgJiYgKGN0eHQtPmNvbXAgIT0gTlVMTCkKICNpZmRlZiBYUEFUSF9TVFJFQU1JTkcKICAgICAgICAgICAgICYmIChjdHh0LT5jb21wLT5zdHJlYW0gPT0gTlVMTCkKICNlbmRpZgpAQCAtMTQ5NTAsMjEgKzE0OTgwLDIxIEBACiAgKiBJZiAkZXNjYXBlLXJlc2VydmVkIGlzIGZhbHNlLCB0aGUgYmVoYXZpb3IgZGlmZmVycyBpbiB0aGF0IGNoYXJhY3RlcnMKICAqIHJlZmVycmVkIHRvIGluIFtSRkMgMjM5Nl0gYXMgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhcmUgbm90IGVzY2FwZWQuIFRoZXNlCiAgKiBjaGFyYWN0ZXJzIGFyZSAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgfCAiJCIgfCAiLCIuCi0gKiAKKyAqCiAgKiBbUkZDIDIzOTZdIGRvZXMgbm90IGRlZmluZSB3aGV0aGVyIGVzY2FwZWQgVVJJcyBzaG91bGQgdXNlIGxvd2VyIGNhc2Ugb3IKICAqIHVwcGVyIGNhc2UgZm9yIGhleGFkZWNpbWFsIGRpZ2l0cy4gVG8gZW5zdXJlIHRoYXQgZXNjYXBlZCBVUklzIGNhbiBiZQogICogY29tcGFyZWQgdXNpbmcgc3RyaW5nIGNvbXBhcmlzb24gZnVuY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG11c3QgYWx3YXlzIHVzZQogICogdGhlIHVwcGVyLWNhc2UgbGV0dGVycyBBLUYuCi0gKiAKKyAqCiAgKiBHZW5lcmFsbHksICRlc2NhcGUtcmVzZXJ2ZWQgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gZXNjYXBpbmcgYSBzdHJpbmcKICAqIHRoYXQgaXMgdG8gZm9ybSBhIHNpbmdsZSBwYXJ0IG9mIGEgVVJJLCBhbmQgdG8gZmFsc2Ugd2hlbiBlc2NhcGluZyBhbgogICogZW50aXJlIFVSSSBvciBVUkkgcmVmZXJlbmNlLgotICogCi0gKiBJbiB0aGUgY2FzZSBvZiBub24tYXNjaWkgY2hhcmFjdGVycywgdGhlIHN0cmluZyBpcyBlbmNvZGVkIGFjY29yZGluZyB0byAKKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBub24tYXNjaWkgY2hhcmFjdGVycywgdGhlIHN0cmluZyBpcyBlbmNvZGVkIGFjY29yZGluZyB0bwogICogdXRmLTggYW5kIHRoZW4gY29udmVydGVkIGFjY29yZGluZyB0byBSRkMgMjM5Ni4KICAqCiAgKiBFeGFtcGxlcwotICogIHhmOmVzY2FwZS11cmkgKCJnb3BoZXI6Ly9zcGluYWx0YXAubWljcm8udW1uLmVkdS8wMC9XZWF0aGVyL0NhbGlmb3JuaWEvTG9zJTIwQW5nZWxlcyNvY2VhbiIpLCB0cnVlKCkpIAorICogIHhmOmVzY2FwZS11cmkgKCJnb3BoZXI6Ly9zcGluYWx0YXAubWljcm8udW1uLmVkdS8wMC9XZWF0aGVyL0NhbGlmb3JuaWEvTG9zJTIwQW5nZWxlcyNvY2VhbiIpLCB0cnVlKCkpCiAgKiAgcmV0dXJucyAiZ29waGVyJTNBJTJGJTJGc3BpbmFsdGFwLm1pY3JvLnVtbi5lZHUlMkYwMCUyRldlYXRoZXIlMkZDYWxpZm9ybmlhJTJGTG9zJTIwQW5nZWxlcyUyM29jZWFuIgogICogIHhmOmVzY2FwZS11cmkgKCJnb3BoZXI6Ly9zcGluYWx0YXAubWljcm8udW1uLmVkdS8wMC9XZWF0aGVyL0NhbGlmb3JuaWEvTG9zJTIwQW5nZWxlcyNvY2VhbiIpLCBmYWxzZSgpKQogICogIHJldHVybnMgImdvcGhlcjovL3NwaW5hbHRhcC5taWNyby51bW4uZWR1LzAwL1dlYXRoZXIvQ2FsaWZvcm5pYS9Mb3MlMjBBbmdlbGVzJTIzb2NlYW4iCkBAIC0xNDk3NywyOCArMTUwMDcsMjggQEAKICAgICB4bWxCdWZmZXJQdHIgdGFyZ2V0OwogICAgIHhtbENoYXIgKmNwdHI7CiAgICAgeG1sQ2hhciBlc2NhcGVbNF07Ci0gICAgCisKICAgICBDSEVDS19BUklUWSgyKTsKLSAgICAKKwogICAgIGVzY2FwZV9yZXNlcnZlZCA9IHhtbFhQYXRoUG9wQm9vbGVhbihjdHh0KTsKLSAgICAKKwogICAgIENBU1RfVE9fU1RSSU5HOwogICAgIHN0ciA9IHZhbHVlUG9wKGN0eHQpOwotICAgIAorCiAgICAgdGFyZ2V0ID0geG1sQnVmZmVyQ3JlYXRlKCk7Ci0gICAgCisKICAgICBlc2NhcGVbMF0gPSAnJSc7CiAgICAgZXNjYXBlWzNdID0gMDsKLSAgICAKKwogICAgIGlmICh0YXJnZXQpIHsKIAlmb3IgKGNwdHIgPSBzdHItPnN0cmluZ3ZhbDsgKmNwdHI7IGNwdHIrKykgewogCSAgICBpZiAoKCpjcHRyID49ICdBJyAmJiAqY3B0ciA8PSAnWicpIHx8CiAJCSgqY3B0ciA+PSAnYScgJiYgKmNwdHIgPD0gJ3onKSB8fAogCQkoKmNwdHIgPj0gJzAnICYmICpjcHRyIDw9ICc5JykgfHwKLQkJKmNwdHIgPT0gJy0nIHx8ICpjcHRyID09ICdfJyB8fCAqY3B0ciA9PSAnLicgfHwgCisJCSpjcHRyID09ICctJyB8fCAqY3B0ciA9PSAnXycgfHwgKmNwdHIgPT0gJy4nIHx8CiAJCSpjcHRyID09ICchJyB8fCAqY3B0ciA9PSAnficgfHwgKmNwdHIgPT0gJyonIHx8CiAJCSpjcHRyID09ICdcJyd8fCAqY3B0ciA9PSAnKCcgfHwgKmNwdHIgPT0gJyknIHx8Ci0JCSgqY3B0ciA9PSAnJScgJiYgCisJCSgqY3B0ciA9PSAnJScgJiYKIAkJICgoY3B0clsxXSA+PSAnQScgJiYgY3B0clsxXSA8PSAnRicpIHx8CiAJCSAgKGNwdHJbMV0gPj0gJ2EnICYmIGNwdHJbMV0gPD0gJ2YnKSB8fAogCQkgIChjcHRyWzFdID49ICcwJyAmJiBjcHRyWzFdIDw9ICc5JykpICYmCkBAIC0xNTAyMCw3ICsxNTA1MCw3IEBACiAJCSAgICBlc2NhcGVbMl0gPSAnMCcgKyAoKmNwdHIgJiAweEYpOwogCQllbHNlCiAJCSAgICBlc2NhcGVbMl0gPSAnQScgLSAxMCArICgqY3B0ciAmIDB4Rik7Ci0JCQorCiAJCXhtbEJ1ZmZlckFkZCh0YXJnZXQsICZlc2NhcGVbMF0sIDMpOwogCSAgICB9CiAJfQo=