LyoKICogIGVidGFibGVzCiAqCiAqICBBdXRob3I6CiAqICBCYXJ0IERlIFNjaHV5bWVyCQk8YmRzY2h1eW1AcGFuZG9yYS5iZT4KICoKICogIGVidGFibGVzLmMsdiAyLjAsIEp1bHksIDIwMDIKICoKICogIFRoaXMgY29kZSBpcyBzdG9uZ2x5IGluc3BpcmVkIG9uIHRoZSBpcHRhYmxlcyBjb2RlIHdoaWNoIGlzCiAqICBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoKLyogdXNlZCBmb3IgcHJpbnRfc3RyaW5nICovCiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvdHR5Lmg+CgojaW5jbHVkZSA8bGludXgva21vZC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgojaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgojaW5jbHVkZSA8bmV0L3NvY2suaD4KLyogbmVlZGVkIGZvciBsb2dpY2FsIFtpbixvdXRdLWRldiBmaWx0ZXJpbmcgKi8KI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKCi8qIGxpc3RfbmFtZWRfZmluZCAqLwojZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQojaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CgojaWYgMAovKiB1c2UgdGhpcyBmb3IgcmVtb3RlIGRlYnVnZ2luZwogKiBDb3B5cmlnaHQgKEMpIDE5OTggYnkgT3JpIFBvbWVyYW50egogKiBQcmludCB0aGUgc3RyaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSB0dHksIHRoZSBvbmUKICogdGhlIGN1cnJlbnQgdGFzayB1c2VzCiAqLwpzdGF0aWMgdm9pZCBwcmludF9zdHJpbmcoY2hhciAqc3RyKQp7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqbXlfdHR5OwoKCS8qIFRoZSB0dHkgZm9yIHRoZSBjdXJyZW50IHRhc2sgKi8KCW15X3R0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5OwoJaWYgKG15X3R0eSAhPSBOVUxMKSB7CgkJbXlfdHR5LT5kcml2ZXItPndyaXRlKG15X3R0eSwgMCwgc3RyLCBzdHJsZW4oc3RyKSk7CgkJbXlfdHR5LT5kcml2ZXItPndyaXRlKG15X3R0eSwgMCwgIlwwMTVcMDEyIiwgMik7Cgl9Cn0KCiNkZWZpbmUgQlVHUFJJTlQoYXJncykgcHJpbnRfc3RyaW5nKGFyZ3MpOwojZWxzZQojZGVmaW5lIEJVR1BSSU5UKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJrZXJuZWwgbXNnOiBlYnRhYmxlcyBidWc6IHBsZWFzZSAiXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnQgdG8gYXV0aG9yOiAiZm9ybWF0LCAjIyBhcmdzKQovKiAjZGVmaW5lIEJVR1BSSU5UKGZvcm1hdCwgYXJncy4uLikgKi8KI2VuZGlmCiNkZWZpbmUgTUVNUFJJTlQoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoImtlcm5lbCBtc2c6IGVidGFibGVzICJcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogb3V0IG9mIG1lbW9yeTogImZvcm1hdCwgIyMgYXJncykKLyogI2RlZmluZSBNRU1QUklOVChmb3JtYXQsIGFyZ3MuLi4pICovCgoKCi8qCiAqIEVhY2ggY3B1IGhhcyBpdHMgb3duIHNldCBvZiBjb3VudGVycywgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3Igd3JpdGVfbG9jayBpbgogKiB0aGUgc29mdGlycQogKiBGb3IgcmVhZGluZyBvciB1cGRhdGluZyB0aGUgY291bnRlcnMsIHRoZSB1c2VyIGNvbnRleHQgbmVlZHMgdG8KICogZ2V0IGEgd3JpdGVfbG9jawogKi8KCi8qIFRoZSBzaXplIG9mIGVhY2ggc2V0IG9mIGNvdW50ZXJzIGlzIGFsdGVyZWQgdG8gZ2V0IGNhY2hlIGFsaWdubWVudCAqLwojZGVmaW5lIFNNUF9BTElHTih4KSAoKCh4KSArIFNNUF9DQUNIRV9CWVRFUy0xKSAmIH4oU01QX0NBQ0hFX0JZVEVTLTEpKQojZGVmaW5lIENPVU5URVJfT0ZGU0VUKG4pIChTTVBfQUxJR04obiAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKSkKI2RlZmluZSBDT1VOVEVSX0JBU0UoYywgbiwgY3B1KSAoKHN0cnVjdCBlYnRfY291bnRlciAqKSgoKGNoYXIgKiljKSArIFwKICAgQ09VTlRFUl9PRkZTRVQobikgKiBjcHUpKQoKCgpzdGF0aWMgREVGSU5FX01VVEVYKGVidF9tdXRleCk7CnN0YXRpYyBMSVNUX0hFQUQoZWJ0X3RhYmxlcyk7CnN0YXRpYyBMSVNUX0hFQUQoZWJ0X3RhcmdldHMpOwpzdGF0aWMgTElTVF9IRUFEKGVidF9tYXRjaGVzKTsKc3RhdGljIExJU1RfSEVBRChlYnRfd2F0Y2hlcnMpOwoKc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IGVidF9zdGFuZGFyZF90YXJnZXQgPQp7IHtOVUxMLCBOVUxMfSwgRUJUX1NUQU5EQVJEX1RBUkdFVCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CgpzdGF0aWMgaW5saW5lIGludCBlYnRfZG9fd2F0Y2hlciAoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LAogICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9va25yLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCnsKCXctPnUud2F0Y2hlci0+d2F0Y2hlcihza2IsIGhvb2tuciwgaW4sIG91dCwgdy0+ZGF0YSwKCSAgIHctPndhdGNoZXJfc2l6ZSk7CgkvKiB3YXRjaGVycyBkb24ndCBnaXZlIGEgdmVyZGljdCAqLwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGVidF9kb19tYXRjaCAoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbSwKICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQp7CglyZXR1cm4gbS0+dS5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT5kYXRhLAoJICAgbS0+bWF0Y2hfc2l6ZSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGVidF9kZXZfY2hlY2soY2hhciAqZW50cnksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXZpY2UpCnsKCWludCBpID0gMDsKCWNoYXIgKmRldm5hbWUgPSBkZXZpY2UtPm5hbWU7CgoJaWYgKCplbnRyeSA9PSAnXDAnKQoJCXJldHVybiAwOwoJaWYgKCFkZXZpY2UpCgkJcmV0dXJuIDE7CgkvKiAxIGlzIHRoZSB3aWxkY2FyZCB0b2tlbiAqLwoJd2hpbGUgKGVudHJ5W2ldICE9ICdcMCcgJiYgZW50cnlbaV0gIT0gMSAmJiBlbnRyeVtpXSA9PSBkZXZuYW1lW2ldKQoJCWkrKzsKCXJldHVybiAoZGV2bmFtZVtpXSAhPSBlbnRyeVtpXSAmJiBlbnRyeVtpXSAhPSAxKTsKfQoKI2RlZmluZSBGV0lOVjIoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShlLT5pbnZmbGFncyAmIGludmZsZykpCi8qIHByb2Nlc3Mgc3RhbmRhcmQgbWF0Y2hlcyAqLwpzdGF0aWMgaW5saW5lIGludCBlYnRfYmFzaWNfbWF0Y2goc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGV0aGhkciAqaCwKICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQp7CglpbnQgdmVyZGljdCwgaTsKCglpZiAoZS0+Yml0bWFzayAmIEVCVF84MDJfMykgewoJCWlmIChGV0lOVjIobnRvaHMoaC0+aF9wcm90bykgPj0gMTUzNiwgRUJUX0lQUk9UTykpCgkJCXJldHVybiAxOwoJfSBlbHNlIGlmICghKGUtPmJpdG1hc2sgJiBFQlRfTk9QUk9UTykgJiYKCSAgIEZXSU5WMihlLT5ldGhwcm90byAhPSBoLT5oX3Byb3RvLCBFQlRfSVBST1RPKSkKCQlyZXR1cm4gMTsKCglpZiAoRldJTlYyKGVidF9kZXZfY2hlY2soZS0+aW4sIGluKSwgRUJUX0lJTikpCgkJcmV0dXJuIDE7CglpZiAoRldJTlYyKGVidF9kZXZfY2hlY2soZS0+b3V0LCBvdXQpLCBFQlRfSU9VVCkpCgkJcmV0dXJuIDE7CglpZiAoKCFpbiB8fCAhaW4tPmJyX3BvcnQpID8gMCA6IEZXSU5WMihlYnRfZGV2X2NoZWNrKAoJICAgZS0+bG9naWNhbF9pbiwgaW4tPmJyX3BvcnQtPmJyLT5kZXYpLCBFQlRfSUxPR0lDQUxJTikpCgkJcmV0dXJuIDE7CglpZiAoKCFvdXQgfHwgIW91dC0+YnJfcG9ydCkgPyAwIDogRldJTlYyKGVidF9kZXZfY2hlY2soCgkgICBlLT5sb2dpY2FsX291dCwgb3V0LT5icl9wb3J0LT5ici0+ZGV2KSwgRUJUX0lMT0dJQ0FMT1VUKSkKCQlyZXR1cm4gMTsKCglpZiAoZS0+Yml0bWFzayAmIEVCVF9TT1VSQ0VNQUMpIHsKCQl2ZXJkaWN0ID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJCQl2ZXJkaWN0IHw9IChoLT5oX3NvdXJjZVtpXSBeIGUtPnNvdXJjZW1hY1tpXSkgJgoJCQkgICBlLT5zb3VyY2Vtc2tbaV07CgkJaWYgKEZXSU5WMih2ZXJkaWN0ICE9IDAsIEVCVF9JU09VUkNFKSApCgkJCXJldHVybiAxOwoJfQoJaWYgKGUtPmJpdG1hc2sgJiBFQlRfREVTVE1BQykgewoJCXZlcmRpY3QgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCgkJCXZlcmRpY3QgfD0gKGgtPmhfZGVzdFtpXSBeIGUtPmRlc3RtYWNbaV0pICYKCQkJICAgZS0+ZGVzdG1za1tpXTsKCQlpZiAoRldJTlYyKHZlcmRpY3QgIT0gMCwgRUJUX0lERVNUKSApCgkJCXJldHVybiAxOwoJfQoJcmV0dXJuIDA7Cn0KCi8qIERvIHNvbWUgZmlyZXdhbGxpbmcgKi8KdW5zaWduZWQgaW50IGVidF9kb190YWJsZSAodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICBzdHJ1Y3QgZWJ0X3RhYmxlICp0YWJsZSkKewoJaW50IGksIG5lbnRyaWVzOwoJc3RydWN0IGVidF9lbnRyeSAqcG9pbnQ7CglzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJfYmFzZSwgKmNiX2Jhc2U7CglzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDsKCWludCB2ZXJkaWN0LCBzcCA9IDA7CglzdHJ1Y3QgZWJ0X2NoYWluc3RhY2sgKmNzOwoJc3RydWN0IGVidF9lbnRyaWVzICpjaGFpbmluZm87CgljaGFyICpiYXNlOwoJc3RydWN0IGVidF90YWJsZV9pbmZvICpwcml2YXRlOwoKCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOwoJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwoJY2JfYmFzZSA9IENPVU5URVJfQkFTRShwcml2YXRlLT5jb3VudGVycywgcHJpdmF0ZS0+bmVudHJpZXMsCgkgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwoJaWYgKHByaXZhdGUtPmNoYWluc3RhY2spCgkJY3MgPSBwcml2YXRlLT5jaGFpbnN0YWNrW3NtcF9wcm9jZXNzb3JfaWQoKV07CgllbHNlCgkJY3MgPSBOVUxMOwoJY2hhaW5pbmZvID0gcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXTsKCW5lbnRyaWVzID0gcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXS0+bmVudHJpZXM7Cglwb2ludCA9IChzdHJ1Y3QgZWJ0X2VudHJ5ICopKHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10tPmRhdGEpOwoJY291bnRlcl9iYXNlID0gY2JfYmFzZSArIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10tPmNvdW50ZXJfb2Zmc2V0OwoJLyogYmFzZSBmb3IgY2hhaW4ganVtcHMgKi8KCWJhc2UgPSBwcml2YXRlLT5lbnRyaWVzOwoJaSA9IDA7Cgl3aGlsZSAoaSA8IG5lbnRyaWVzKSB7CgkJaWYgKGVidF9iYXNpY19tYXRjaChwb2ludCwgZXRoX2hkcigqcHNrYiksIGluLCBvdXQpKQoJCQlnb3RvIGxldHNjb250aW51ZTsKCgkJaWYgKEVCVF9NQVRDSF9JVEVSQVRFKHBvaW50LCBlYnRfZG9fbWF0Y2gsICpwc2tiLCBpbiwgb3V0KSAhPSAwKQoJCQlnb3RvIGxldHNjb250aW51ZTsKCgkJLyogaW5jcmVhc2UgY291bnRlciAqLwoJCSgqKGNvdW50ZXJfYmFzZSArIGkpKS5wY250Kys7CgkJKCooY291bnRlcl9iYXNlICsgaSkpLmJjbnQrPSgqKnBza2IpLmxlbjsKCgkJLyogdGhlc2Ugc2hvdWxkIG9ubHkgd2F0Y2g6IG5vdCBtb2RpZnksIG5vciB0ZWxsIHVzCgkJICAgd2hhdCB0byBkbyB3aXRoIHRoZSBwYWNrZXQgKi8KCQlFQlRfV0FUQ0hFUl9JVEVSQVRFKHBvaW50LCBlYnRfZG9fd2F0Y2hlciwgKnBza2IsIGhvb2ssIGluLAoJCSAgIG91dCk7CgoJCXQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKikKCQkgICAoKChjaGFyICopcG9pbnQpICsgcG9pbnQtPnRhcmdldF9vZmZzZXQpOwoJCS8qIHN0YW5kYXJkIHRhcmdldCAqLwoJCWlmICghdC0+dS50YXJnZXQtPnRhcmdldCkKCQkJdmVyZGljdCA9ICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdDsKCQllbHNlCgkJCXZlcmRpY3QgPSB0LT51LnRhcmdldC0+dGFyZ2V0KHBza2IsIGhvb2ssCgkJCSAgIGluLCBvdXQsIHQtPmRhdGEsIHQtPnRhcmdldF9zaXplKTsKCQlpZiAodmVyZGljdCA9PSBFQlRfQUNDRVBUKSB7CgkJCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CgkJCXJldHVybiBORl9BQ0NFUFQ7CgkJfQoJCWlmICh2ZXJkaWN0ID09IEVCVF9EUk9QKSB7CgkJCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CgkJCXJldHVybiBORl9EUk9QOwoJCX0KCQlpZiAodmVyZGljdCA9PSBFQlRfUkVUVVJOKSB7CmxldHNyZXR1cm46CiNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCgkJCWlmIChzcCA9PSAwKSB7CgkJCQlCVUdQUklOVCgiUkVUVVJOIG9uIGJhc2UgY2hhaW4iKTsKCQkJCS8qIGFjdCBsaWtlIHRoaXMgaXMgRUJUX0NPTlRJTlVFICovCgkJCQlnb3RvIGxldHNjb250aW51ZTsKCQkJfQojZW5kaWYKCQkJc3AtLTsKCQkJLyogcHV0IGFsbCB0aGUgbG9jYWwgdmFyaWFibGVzIHJpZ2h0ICovCgkJCWkgPSBjc1tzcF0ubjsKCQkJY2hhaW5pbmZvID0gY3Nbc3BdLmNoYWluaW5mbzsKCQkJbmVudHJpZXMgPSBjaGFpbmluZm8tPm5lbnRyaWVzOwoJCQlwb2ludCA9IGNzW3NwXS5lOwoJCQljb3VudGVyX2Jhc2UgPSBjYl9iYXNlICsKCQkJICAgY2hhaW5pbmZvLT5jb3VudGVyX29mZnNldDsKCQkJY29udGludWU7CgkJfQoJCWlmICh2ZXJkaWN0ID09IEVCVF9DT05USU5VRSkKCQkJZ290byBsZXRzY29udGludWU7CiNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCgkJaWYgKHZlcmRpY3QgPCAwKSB7CgkJCUJVR1BSSU5UKCJib2d1cyBzdGFuZGFyZCB2ZXJkaWN0XG4iKTsKCQkJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKCQkJcmV0dXJuIE5GX0RST1A7CgkJfQojZW5kaWYKCQkvKiBqdW1wIHRvIGEgdWRjICovCgkJY3Nbc3BdLm4gPSBpICsgMTsKCQljc1tzcF0uY2hhaW5pbmZvID0gY2hhaW5pbmZvOwoJCWNzW3NwXS5lID0gKHN0cnVjdCBlYnRfZW50cnkgKikKCQkgICAoKChjaGFyICopcG9pbnQpICsgcG9pbnQtPm5leHRfb2Zmc2V0KTsKCQlpID0gMDsKCQljaGFpbmluZm8gPSAoc3RydWN0IGVidF9lbnRyaWVzICopIChiYXNlICsgdmVyZGljdCk7CiNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCgkJaWYgKGNoYWluaW5mby0+ZGlzdGluZ3Vpc2hlcikgewoJCQlCVUdQUklOVCgianVtcCB0byBub24tY2hhaW5cbiIpOwoJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwoJCQlyZXR1cm4gTkZfRFJPUDsKCQl9CiNlbmRpZgoJCW5lbnRyaWVzID0gY2hhaW5pbmZvLT5uZW50cmllczsKCQlwb2ludCA9IChzdHJ1Y3QgZWJ0X2VudHJ5ICopY2hhaW5pbmZvLT5kYXRhOwoJCWNvdW50ZXJfYmFzZSA9IGNiX2Jhc2UgKyBjaGFpbmluZm8tPmNvdW50ZXJfb2Zmc2V0OwoJCXNwKys7CgkJY29udGludWU7CmxldHNjb250aW51ZToKCQlwb2ludCA9IChzdHJ1Y3QgZWJ0X2VudHJ5ICopCgkJICAgKCgoY2hhciAqKXBvaW50KSArIHBvaW50LT5uZXh0X29mZnNldCk7CgkJaSsrOwoJfQoKCS8qIEkgYWN0dWFsbHkgbGlrZSB0aGlzIDopICovCglpZiAoY2hhaW5pbmZvLT5wb2xpY3kgPT0gRUJUX1JFVFVSTikKCQlnb3RvIGxldHNyZXR1cm47CglpZiAoY2hhaW5pbmZvLT5wb2xpY3kgPT0gRUJUX0FDQ0VQVCkgewoJCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CgkJcmV0dXJuIE5GX0FDQ0VQVDsKCX0KCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CglyZXR1cm4gTkZfRFJPUDsKfQoKLyogSWYgaXQgc3VjY2VlZHMsIHJldHVybnMgZWxlbWVudCBhbmQgbG9ja3MgbXV0ZXggKi8Kc3RhdGljIGlubGluZSB2b2lkICoKZmluZF9pbmxpc3RfbG9ja19ub2xvYWQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICplcnJvciwKICAgc3RydWN0IG11dGV4ICptdXRleCkKewoJdm9pZCAqcmV0OwoKCSplcnJvciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShtdXRleCk7CglpZiAoKmVycm9yICE9IDApCgkJcmV0dXJuIE5VTEw7CgoJcmV0ID0gbGlzdF9uYW1lZF9maW5kKGhlYWQsIG5hbWUpOwoJaWYgKCFyZXQpIHsKCQkqZXJyb3IgPSAtRU5PRU5UOwoJCW11dGV4X3VubG9jayhtdXRleCk7Cgl9CglyZXR1cm4gcmV0Owp9CgojaWZuZGVmIENPTkZJR19LTU9ECiNkZWZpbmUgZmluZF9pbmxpc3RfbG9jayhoLG4scCxlLG0pIGZpbmRfaW5saXN0X2xvY2tfbm9sb2FkKChoKSwobiksKGUpLChtKSkKI2Vsc2UKc3RhdGljIHZvaWQgKgpmaW5kX2lubGlzdF9sb2NrKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByZWZpeCwKICAgaW50ICplcnJvciwgc3RydWN0IG11dGV4ICptdXRleCkKewoJdm9pZCAqcmV0OwoKCXJldCA9IGZpbmRfaW5saXN0X2xvY2tfbm9sb2FkKGhlYWQsIG5hbWUsIGVycm9yLCBtdXRleCk7CglpZiAoIXJldCkgewoJCXJlcXVlc3RfbW9kdWxlKCIlcyVzIiwgcHJlZml4LCBuYW1lKTsKCQlyZXQgPSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZChoZWFkLCBuYW1lLCBlcnJvciwgbXV0ZXgpOwoJfQoJcmV0dXJuIHJldDsKfQojZW5kaWYKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGVidF90YWJsZSAqCmZpbmRfdGFibGVfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3QgbXV0ZXggKm11dGV4KQp7CglyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmZWJ0X3RhYmxlcywgbmFtZSwgImVidGFibGVfIiwgZXJyb3IsIG11dGV4KTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgZWJ0X21hdGNoICoKZmluZF9tYXRjaF9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBtdXRleCAqbXV0ZXgpCnsKCXJldHVybiBmaW5kX2lubGlzdF9sb2NrKCZlYnRfbWF0Y2hlcywgbmFtZSwgImVidF8iLCBlcnJvciwgbXV0ZXgpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfd2F0Y2hlciAqCmZpbmRfd2F0Y2hlcl9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBtdXRleCAqbXV0ZXgpCnsKCXJldHVybiBmaW5kX2lubGlzdF9sb2NrKCZlYnRfd2F0Y2hlcnMsIG5hbWUsICJlYnRfIiwgZXJyb3IsIG11dGV4KTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgZWJ0X3RhcmdldCAqCmZpbmRfdGFyZ2V0X2xvY2soY29uc3QgY2hhciAqbmFtZSwgaW50ICplcnJvciwgc3RydWN0IG11dGV4ICptdXRleCkKewoJcmV0dXJuIGZpbmRfaW5saXN0X2xvY2soJmVidF90YXJnZXRzLCBuYW1lLCAiZWJ0XyIsIGVycm9yLCBtdXRleCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50CmVidF9jaGVja19tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLAogICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCAqY250KQp7CglzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaDsKCWludCByZXQ7CgoJaWYgKCgoY2hhciAqKW0pICsgbS0+bWF0Y2hfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSA+CgkgICAoKGNoYXIgKillKSArIGUtPndhdGNoZXJzX29mZnNldCkKCQlyZXR1cm4gLUVJTlZBTDsKCW1hdGNoID0gZmluZF9tYXRjaF9sb2NrKG0tPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CglpZiAoIW1hdGNoKQoJCXJldHVybiByZXQ7CgltLT51Lm1hdGNoID0gbWF0Y2g7CglpZiAoIXRyeV9tb2R1bGVfZ2V0KG1hdGNoLT5tZSkpIHsKCQltdXRleF91bmxvY2soJmVidF9tdXRleCk7CgkJcmV0dXJuIC1FTk9FTlQ7Cgl9CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7CglpZiAobWF0Y2gtPmNoZWNrICYmCgkgICBtYXRjaC0+Y2hlY2sobmFtZSwgaG9va21hc2ssIGUsIG0tPmRhdGEsIG0tPm1hdGNoX3NpemUpICE9IDApIHsKCQlCVUdQUklOVCgibWF0Y2gtPmNoZWNrIGZhaWxlZFxuIik7CgkJbW9kdWxlX3B1dChtYXRjaC0+bWUpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJKCpjbnQpKys7CglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQKZWJ0X2NoZWNrX3dhdGNoZXIoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLAogICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCAqY250KQp7CglzdHJ1Y3QgZWJ0X3dhdGNoZXIgKndhdGNoZXI7CglpbnQgcmV0OwoKCWlmICgoKGNoYXIgKil3KSArIHctPndhdGNoZXJfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpID4KCSAgICgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCkKCQlyZXR1cm4gLUVJTlZBTDsKCXdhdGNoZXIgPSBmaW5kX3dhdGNoZXJfbG9jayh3LT51Lm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOwoJaWYgKCF3YXRjaGVyKQoJCXJldHVybiByZXQ7Cgl3LT51LndhdGNoZXIgPSB3YXRjaGVyOwoJaWYgKCF0cnlfbW9kdWxlX2dldCh3YXRjaGVyLT5tZSkpIHsKCQltdXRleF91bmxvY2soJmVidF9tdXRleCk7CgkJcmV0dXJuIC1FTk9FTlQ7Cgl9CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7CglpZiAod2F0Y2hlci0+Y2hlY2sgJiYKCSAgIHdhdGNoZXItPmNoZWNrKG5hbWUsIGhvb2ttYXNrLCBlLCB3LT5kYXRhLCB3LT53YXRjaGVyX3NpemUpICE9IDApIHsKCQlCVUdQUklOVCgid2F0Y2hlci0+Y2hlY2sgZmFpbGVkXG4iKTsKCQltb2R1bGVfcHV0KHdhdGNoZXItPm1lKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCSgqY250KSsrOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIHRoaXMgb25lIGlzIHZlcnkgY2FyZWZ1bCwgYXMgaXQgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uCiAqIHRvIHBhcnNlIHRoZSB1c2Vyc3BhY2UgZGF0YQogKi8Kc3RhdGljIGlubGluZSBpbnQKZWJ0X2NoZWNrX2VudHJ5X3NpemVfYW5kX2hvb2tzKHN0cnVjdCBlYnRfZW50cnkgKmUsCiAgIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbywgY2hhciAqYmFzZSwgY2hhciAqbGltaXQsCiAgIHN0cnVjdCBlYnRfZW50cmllcyAqKmhvb2tfZW50cmllcywgdW5zaWduZWQgaW50ICpuLCB1bnNpZ25lZCBpbnQgKmNudCwKICAgdW5zaWduZWQgaW50ICp0b3RhbGNudCwgdW5zaWduZWQgaW50ICp1ZGNfY250LCB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CgkJaWYgKCh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQoJCQljb250aW51ZTsKCQlpZiAoIChjaGFyICopaG9va19lbnRyaWVzW2ldIC0gYmFzZSA9PQoJCSAgIChjaGFyICopZSAtIG5ld2luZm8tPmVudHJpZXMpCgkJCWJyZWFrOwoJfQoJLyogYmVnaW5uaW5nIG9mIGEgbmV3IGNoYWluCgkgICBpZiBpID09IE5GX0JSX05VTUhPT0tTIGl0IG11c3QgYmUgYSB1c2VyIGRlZmluZWQgY2hhaW4gKi8KCWlmIChpICE9IE5GX0JSX05VTUhPT0tTIHx8ICEoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSkgewoJCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSAhPSAwKSB7CgkJCS8qIHdlIG1ha2UgdXNlcnNwYWNlIHNldCB0aGlzIHJpZ2h0LAoJCQkgICBzbyB0aGVyZSBpcyBubyBtaXN1bmRlcnN0YW5kaW5nICovCgkJCUJVR1BSSU5UKCJFQlRfRU5UUllfT1JfRU5UUklFUyBzaG91bGRuJ3QgYmUgc2V0ICIKCQkJICAgICAgICAgImluIGRpc3Rpbmd1aXNoZXJcbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJLyogdGhpcyBjaGVja3MgaWYgdGhlIHByZXZpb3VzIGNoYWluIGhhcyBhcyBtYW55IGVudHJpZXMKCQkgICBhcyBpdCBzYWlkIGl0IGhhcyAqLwoJCWlmICgqbiAhPSAqY250KSB7CgkJCUJVR1BSSU5UKCJuZW50cmllcyBkb2VzIG5vdCBlcXVhbCB0aGUgbnIgb2YgZW50cmllcyAiCgkJICAgICAgICAgICAgICAgICAiaW4gdGhlIGNoYWluXG4iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJCS8qIGJlZm9yZSB3ZSBsb29rIGF0IHRoZSBzdHJ1Y3QsIGJlIHN1cmUgaXQgaXMgbm90IHRvbyBiaWcgKi8KCQlpZiAoKGNoYXIgKilob29rX2VudHJpZXNbaV0gKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKQoJCSAgID4gbGltaXQpIHsKCQkJQlVHUFJJTlQoImVudHJpZXNfc2l6ZSB0b28gc21hbGxcbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJaWYgKCgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfRFJPUCAmJgoJCSAgICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfQUNDRVBUKSB7CgkJCS8qIG9ubHkgUkVUVVJOIGZyb20gdWRjICovCgkJCWlmIChpICE9IE5GX0JSX05VTUhPT0tTIHx8CgkJCSAgICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfUkVUVVJOKSB7CgkJCQlCVUdQUklOVCgiYmFkIHBvbGljeVxuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCX0KCQlpZiAoaSA9PSBORl9CUl9OVU1IT09LUykgLyogaXQncyBhIHVzZXIgZGVmaW5lZCBjaGFpbiAqLwoJCQkoKnVkY19jbnQpKys7CgkJZWxzZQoJCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gKHN0cnVjdCBlYnRfZW50cmllcyAqKWU7CgkJaWYgKCgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPmNvdW50ZXJfb2Zmc2V0ICE9ICp0b3RhbGNudCkgewoJCQlCVUdQUklOVCgiY291bnRlcl9vZmZzZXQgIT0gdG90YWxjbnQiKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJCSpuID0gKChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillKS0+bmVudHJpZXM7CgkJKmNudCA9IDA7CgkJcmV0dXJuIDA7Cgl9CgkvKiBhIHBsYWluIG9sZCBlbnRyeSwgaGVoICovCglpZiAoc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnkpID4gZS0+d2F0Y2hlcnNfb2Zmc2V0IHx8CgkgICBlLT53YXRjaGVyc19vZmZzZXQgPiBlLT50YXJnZXRfb2Zmc2V0IHx8CgkgICBlLT50YXJnZXRfb2Zmc2V0ID49IGUtPm5leHRfb2Zmc2V0KSB7CgkJQlVHUFJJTlQoImVudHJ5IG9mZnNldHMgbm90IGluIHJpZ2h0IG9yZGVyXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCS8qIHRoaXMgaXMgbm90IGNoZWNrZWQgYW55d2hlcmUgZWxzZSAqLwoJaWYgKGUtPm5leHRfb2Zmc2V0IC0gZS0+dGFyZ2V0X29mZnNldCA8IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCkpIHsKCQlCVUdQUklOVCgidGFyZ2V0IHNpemUgdG9vIHNtYWxsXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkoKmNudCkrKzsKCSgqdG90YWxjbnQpKys7CglyZXR1cm4gMDsKfQoKc3RydWN0IGVidF9jbF9zdGFjawp7CglzdHJ1Y3QgZWJ0X2NoYWluc3RhY2sgY3M7CglpbnQgZnJvbTsKCXVuc2lnbmVkIGludCBob29rbWFzazsKfTsKCi8qCiAqIHdlIG5lZWQgdGhlc2UgcG9zaXRpb25zIHRvIGNoZWNrIHRoYXQgdGhlIGp1bXBzIHRvIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlCiAqIGVudHJpZXMgaXMgYSBqdW1wIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgY2hhaW4uCiAqLwpzdGF0aWMgaW5saW5lIGludAplYnRfZ2V0X3VkY19wb3NpdGlvbnMoc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAogICBzdHJ1Y3QgZWJ0X2VudHJpZXMgKipob29rX2VudHJpZXMsIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAogICBzdHJ1Y3QgZWJ0X2NsX3N0YWNrICp1ZGMpCnsKCWludCBpOwoKCS8qIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFpbiBzdGFydHMgKi8KCWlmIChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpCgkJcmV0dXJuIDA7Cglmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgewoJCWlmICgodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKCQkJY29udGludWU7CgkJaWYgKG5ld2luZm8tPmhvb2tfZW50cnlbaV0gPT0gKHN0cnVjdCBlYnRfZW50cmllcyAqKWUpCgkJCWJyZWFrOwoJfQoJLyogb25seSBjYXJlIGFib3V0IHVkYyAqLwoJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MpCgkJcmV0dXJuIDA7CgoJdWRjWypuXS5jcy5jaGFpbmluZm8gPSAoc3RydWN0IGVidF9lbnRyaWVzICopZTsKCS8qIHRoZXNlIGluaXRpYWxpc2F0aW9ucyBhcmUgZGVwZW5kZWQgb24gbGF0ZXIgaW4gY2hlY2tfY2hhaW5sb29wcygpICovCgl1ZGNbKm5dLmNzLm4gPSAwOwoJdWRjWypuXS5ob29rbWFzayA9IDA7CgoJKCpuKSsrOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50CmVidF9jbGVhbnVwX21hdGNoKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqaSkKewoJaWYgKGkgJiYgKCppKS0tID09IDApCgkJcmV0dXJuIDE7CglpZiAobS0+dS5tYXRjaC0+ZGVzdHJveSkKCQltLT51Lm1hdGNoLT5kZXN0cm95KG0tPmRhdGEsIG0tPm1hdGNoX3NpemUpOwoJbW9kdWxlX3B1dChtLT51Lm1hdGNoLT5tZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50CmVidF9jbGVhbnVwX3dhdGNoZXIoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LCB1bnNpZ25lZCBpbnQgKmkpCnsKCWlmIChpICYmICgqaSktLSA9PSAwKQoJCXJldHVybiAxOwoJaWYgKHctPnUud2F0Y2hlci0+ZGVzdHJveSkKCQl3LT51LndhdGNoZXItPmRlc3Ryb3kody0+ZGF0YSwgdy0+d2F0Y2hlcl9zaXplKTsKCW1vZHVsZV9wdXQody0+dS53YXRjaGVyLT5tZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50CmVidF9jbGVhbnVwX2VudHJ5KHN0cnVjdCBlYnRfZW50cnkgKmUsIHVuc2lnbmVkIGludCAqY250KQp7CglzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDsKCglpZiAoKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykgPT0gMCkKCQlyZXR1cm4gMDsKCS8qIHdlJ3JlIGRvbmUgKi8KCWlmIChjbnQgJiYgKCpjbnQpLS0gPT0gMCkKCQlyZXR1cm4gMTsKCUVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X2NsZWFudXBfd2F0Y2hlciwgTlVMTCk7CglFQlRfTUFUQ0hfSVRFUkFURShlLCBlYnRfY2xlYW51cF9tYXRjaCwgTlVMTCk7Cgl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CglpZiAodC0+dS50YXJnZXQtPmRlc3Ryb3kpCgkJdC0+dS50YXJnZXQtPmRlc3Ryb3kodC0+ZGF0YSwgdC0+dGFyZ2V0X3NpemUpOwoJbW9kdWxlX3B1dCh0LT51LnRhcmdldC0+bWUpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIGludAplYnRfY2hlY2tfZW50cnkoc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAogICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKmNudCwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAogICBzdHJ1Y3QgZWJ0X2NsX3N0YWNrICpjbF9zLCB1bnNpZ25lZCBpbnQgdWRjX2NudCkKewoJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CglzdHJ1Y3QgZWJ0X3RhcmdldCAqdGFyZ2V0OwoJdW5zaWduZWQgaW50IGksIGosIGhvb2sgPSAwLCBob29rbWFzayA9IDA7CglpbnQgcmV0OwoKCS8qIGRvbid0IG1lc3Mgd2l0aCB0aGUgc3RydWN0IGVidF9lbnRyaWVzICovCglpZiAoKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykgPT0gMCkKCQlyZXR1cm4gMDsKCglpZiAoZS0+Yml0bWFzayAmIH5FQlRfRl9NQVNLKSB7CgkJQlVHUFJJTlQoIlVua25vd24gZmxhZyBmb3IgYml0bWFza1xuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglpZiAoZS0+aW52ZmxhZ3MgJiB+RUJUX0lOVl9NQVNLKSB7CgkJQlVHUFJJTlQoIlVua25vd24gZmxhZyBmb3IgaW52IGJpdG1hc2tcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJaWYgKCAoZS0+Yml0bWFzayAmIEVCVF9OT1BST1RPKSAmJiAoZS0+Yml0bWFzayAmIEVCVF84MDJfMykgKSB7CgkJQlVHUFJJTlQoIk5PUFJPVE8gJiA4MDJfMyBub3QgYWxsb3dlZFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgkvKiB3aGF0IGhvb2sgZG8gd2UgYmVsb25nIHRvPyAqLwoJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKCQlpZiAoKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpID09IDApCgkJCWNvbnRpbnVlOwoJCWlmICgoY2hhciAqKW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPCAoY2hhciAqKWUpCgkJCWhvb2sgPSBpOwoJCWVsc2UKCQkJYnJlYWs7Cgl9CgkvKiAoMSA8PCBORl9CUl9OVU1IT09LUykgdGVsbHMgdGhlIGNoZWNrIGZ1bmN0aW9ucyB0aGUgcnVsZSBpcyBvbgoJICAgYSBiYXNlIGNoYWluICovCglpZiAoaSA8IE5GX0JSX05VTUhPT0tTKQoJCWhvb2ttYXNrID0gKDEgPDwgaG9vaykgfCAoMSA8PCBORl9CUl9OVU1IT09LUyk7CgllbHNlIHsKCQlmb3IgKGkgPSAwOyBpIDwgdWRjX2NudDsgaSsrKQoJCQlpZiAoKGNoYXIgKikoY2xfc1tpXS5jcy5jaGFpbmluZm8pID4gKGNoYXIgKillKQoJCQkJYnJlYWs7CgkJaWYgKGkgPT0gMCkKCQkJaG9va21hc2sgPSAoMSA8PCBob29rKSB8ICgxIDw8IE5GX0JSX05VTUhPT0tTKTsKCQllbHNlCgkJCWhvb2ttYXNrID0gY2xfc1tpIC0gMV0uaG9va21hc2s7Cgl9CglpID0gMDsKCXJldCA9IEVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jaGVja19tYXRjaCwgZSwgbmFtZSwgaG9va21hc2ssICZpKTsKCWlmIChyZXQgIT0gMCkKCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKCWogPSAwOwoJcmV0ID0gRUJUX1dBVENIRVJfSVRFUkFURShlLCBlYnRfY2hlY2tfd2F0Y2hlciwgZSwgbmFtZSwgaG9va21hc2ssICZqKTsKCWlmIChyZXQgIT0gMCkKCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7Cgl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7Cgl0YXJnZXQgPSBmaW5kX3RhcmdldF9sb2NrKHQtPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CglpZiAoIXRhcmdldCkKCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CglpZiAoIXRyeV9tb2R1bGVfZ2V0KHRhcmdldC0+bWUpKSB7CgkJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwoJCXJldCA9IC1FTk9FTlQ7CgkJZ290byBjbGVhbnVwX3dhdGNoZXJzOwoJfQoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwoKCXQtPnUudGFyZ2V0ID0gdGFyZ2V0OwoJaWYgKHQtPnUudGFyZ2V0ID09ICZlYnRfc3RhbmRhcmRfdGFyZ2V0KSB7CgkJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQpID4KCQkgICBlLT5uZXh0X29mZnNldCkgewoJCQlCVUdQUklOVCgiU3RhbmRhcmQgdGFyZ2V0IHNpemUgdG9vIGJpZ1xuIik7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKCQl9CgkJaWYgKCgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdCA8CgkJICAgLU5VTV9TVEFOREFSRF9UQVJHRVRTKSB7CgkJCUJVR1BSSU5UKCJJbnZhbGlkIHN0YW5kYXJkIHRhcmdldFxuIik7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKCQl9Cgl9IGVsc2UgaWYgKChlLT50YXJnZXRfb2Zmc2V0ICsgdC0+dGFyZ2V0X3NpemUgKwoJICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSA+IGUtPm5leHRfb2Zmc2V0KSB8fAoJICAgKHQtPnUudGFyZ2V0LT5jaGVjayAmJgoJICAgdC0+dS50YXJnZXQtPmNoZWNrKG5hbWUsIGhvb2ttYXNrLCBlLCB0LT5kYXRhLCB0LT50YXJnZXRfc2l6ZSkgIT0gMCkpewoJCW1vZHVsZV9wdXQodC0+dS50YXJnZXQtPm1lKTsKCQlyZXQgPSAtRUZBVUxUOwoJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKCX0KCSgqY250KSsrOwoJcmV0dXJuIDA7CmNsZWFudXBfd2F0Y2hlcnM6CglFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX3dhdGNoZXIsICZqKTsKY2xlYW51cF9tYXRjaGVzOgoJRUJUX01BVENIX0lURVJBVEUoZSwgZWJ0X2NsZWFudXBfbWF0Y2gsICZpKTsKCXJldHVybiByZXQ7Cn0KCi8qCiAqIGNoZWNrcyBmb3IgbG9vcHMgYW5kIHNldHMgdGhlIGhvb2sgbWFzayBmb3IgdWRjCiAqIHRoZSBob29rIG1hc2sgZm9yIHVkYyB0ZWxscyB1cyBmcm9tIHdoaWNoIGJhc2UgY2hhaW5zIHRoZSB1ZGMgY2FuIGJlCiAqIGFjY2Vzc2VkLiBUaGlzIG1hc2sgaXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGNoZWNrKCkgZnVuY3Rpb25zIG9mIHRoZSBleHRlbnNpb25zCiAqLwpzdGF0aWMgaW50IGNoZWNrX2NoYWlubG9vcHMoc3RydWN0IGVidF9lbnRyaWVzICpjaGFpbiwgc3RydWN0IGVidF9jbF9zdGFjayAqY2xfcywKICAgdW5zaWduZWQgaW50IHVkY19jbnQsIHVuc2lnbmVkIGludCBob29rbnIsIGNoYXIgKmJhc2UpCnsKCWludCBpLCBjaGFpbl9uciA9IC0xLCBwb3MgPSAwLCBuZW50cmllcyA9IGNoYWluLT5uZW50cmllcywgdmVyZGljdDsKCXN0cnVjdCBlYnRfZW50cnkgKmUgPSAoc3RydWN0IGVidF9lbnRyeSAqKWNoYWluLT5kYXRhOwoJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CgoJd2hpbGUgKHBvcyA8IG5lbnRyaWVzIHx8IGNoYWluX25yICE9IC0xKSB7CgkJLyogZW5kIG9mIHVkYywgZ28gYmFjayBvbmUgJ3JlY3Vyc2lvbicgc3RlcCAqLwoJCWlmIChwb3MgPT0gbmVudHJpZXMpIHsKCQkJLyogcHV0IGJhY2sgdmFsdWVzIG9mIHRoZSB0aW1lIHdoZW4gdGhpcyBjaGFpbiB3YXMgY2FsbGVkICovCgkJCWUgPSBjbF9zW2NoYWluX25yXS5jcy5lOwoJCQlpZiAoY2xfc1tjaGFpbl9ucl0uZnJvbSAhPSAtMSkKCQkJCW5lbnRyaWVzID0KCQkJCWNsX3NbY2xfc1tjaGFpbl9ucl0uZnJvbV0uY3MuY2hhaW5pbmZvLT5uZW50cmllczsKCQkJZWxzZQoJCQkJbmVudHJpZXMgPSBjaGFpbi0+bmVudHJpZXM7CgkJCXBvcyA9IGNsX3NbY2hhaW5fbnJdLmNzLm47CgkJCS8qIG1ha2Ugc3VyZSB3ZSB3b24ndCBzZWUgYSBsb29wIHRoYXQgaXNuJ3Qgb25lICovCgkJCWNsX3NbY2hhaW5fbnJdLmNzLm4gPSAwOwoJCQljaGFpbl9uciA9IGNsX3NbY2hhaW5fbnJdLmZyb207CgkJCWlmIChwb3MgPT0gbmVudHJpZXMpCgkJCQljb250aW51ZTsKCQl9CgkJdCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKQoJCSAgICgoKGNoYXIgKillKSArIGUtPnRhcmdldF9vZmZzZXQpOwoJCWlmIChzdHJjbXAodC0+dS5uYW1lLCBFQlRfU1RBTkRBUkRfVEFSR0VUKSkKCQkJZ290byBsZXRzY29udGludWU7CgkJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQpID4KCQkgICBlLT5uZXh0X29mZnNldCkgewoJCQlCVUdQUklOVCgiU3RhbmRhcmQgdGFyZ2V0IHNpemUgdG9vIGJpZ1xuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJdmVyZGljdCA9ICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdDsKCQlpZiAodmVyZGljdCA+PSAwKSB7IC8qIGp1bXAgdG8gYW5vdGhlciBjaGFpbiAqLwoJCQlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhscDIgPQoJCQkgICAoc3RydWN0IGVidF9lbnRyaWVzICopKGJhc2UgKyB2ZXJkaWN0KTsKCQkJZm9yIChpID0gMDsgaSA8IHVkY19jbnQ7IGkrKykKCQkJCWlmIChobHAyID09IGNsX3NbaV0uY3MuY2hhaW5pbmZvKQoJCQkJCWJyZWFrOwoJCQkvKiBiYWQgZGVzdGluYXRpb24gb3IgbG9vcCAqLwoJCQlpZiAoaSA9PSB1ZGNfY250KSB7CgkJCQlCVUdQUklOVCgiYmFkIGRlc3RpbmF0aW9uXG4iKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoY2xfc1tpXS5jcy5uKSB7CgkJCQlCVUdQUklOVCgibG9vcFxuIik7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJLyogdGhpcyBjYW4ndCBiZSAwLCBzbyB0aGUgYWJvdmUgdGVzdCBpcyBjb3JyZWN0ICovCgkJCWNsX3NbaV0uY3MubiA9IHBvcyArIDE7CgkJCXBvcyA9IDA7CgkJCWNsX3NbaV0uY3MuZSA9ICgodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldCk7CgkJCWUgPSAoc3RydWN0IGVidF9lbnRyeSAqKShobHAyLT5kYXRhKTsKCQkJbmVudHJpZXMgPSBobHAyLT5uZW50cmllczsKCQkJY2xfc1tpXS5mcm9tID0gY2hhaW5fbnI7CgkJCWNoYWluX25yID0gaTsKCQkJLyogdGhpcyB1ZGMgaXMgYWNjZXNzaWJsZSBmcm9tIHRoZSBiYXNlIGNoYWluIGZvciBob29rbnIgKi8KCQkJY2xfc1tpXS5ob29rbWFzayB8PSAoMSA8PCBob29rbnIpOwoJCQljb250aW51ZTsKCQl9CmxldHNjb250aW51ZToKCQllID0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CgkJcG9zKys7Cgl9CglyZXR1cm4gMDsKfQoKLyogZG8gdGhlIHBhcnNpbmcgb2YgdGhlIHRhYmxlL2NoYWlucy9lbnRyaWVzL21hdGNoZXMvd2F0Y2hlcnMvdGFyZ2V0cywgaGVoICovCnN0YXRpYyBpbnQgdHJhbnNsYXRlX3RhYmxlKHN0cnVjdCBlYnRfcmVwbGFjZSAqcmVwbCwKICAgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvKQp7Cgl1bnNpZ25lZCBpbnQgaSwgaiwgaywgdWRjX2NudDsKCWludCByZXQ7CglzdHJ1Y3QgZWJ0X2NsX3N0YWNrICpjbF9zID0gTlVMTDsgLyogdXNlZCBpbiB0aGUgY2hlY2tpbmcgZm9yIGNoYWluIGxvb3BzICovCgoJaSA9IDA7Cgl3aGlsZSAoaSA8IE5GX0JSX05VTUhPT0tTICYmICEocmVwbC0+dmFsaWRfaG9va3MgJiAoMSA8PCBpKSkpCgkJaSsrOwoJaWYgKGkgPT0gTkZfQlJfTlVNSE9PS1MpIHsKCQlCVUdQUklOVCgiTm8gdmFsaWQgaG9va3Mgc3BlY2lmaWVkXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCWlmIChyZXBsLT5ob29rX2VudHJ5W2ldICE9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKilyZXBsLT5lbnRyaWVzKSB7CgkJQlVHUFJJTlQoIkNoYWlucyBkb24ndCBzdGFydCBhdCBiZWdpbm5pbmdcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJLyogbWFrZSBzdXJlIGNoYWlucyBhcmUgb3JkZXJlZCBhZnRlciBlYWNoIG90aGVyIGluIHNhbWUgb3JkZXIKCSAgIGFzIHRoZWlyIGNvcnJlc3BvbmRpbmcgaG9va3MgKi8KCWZvciAoaiA9IGkgKyAxOyBqIDwgTkZfQlJfTlVNSE9PS1M7IGorKykgewoJCWlmICghKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaikpKQoJCQljb250aW51ZTsKCQlpZiAoIHJlcGwtPmhvb2tfZW50cnlbal0gPD0gcmVwbC0+aG9va19lbnRyeVtpXSApIHsKCQkJQlVHUFJJTlQoIkhvb2sgb3JkZXIgbXVzdCBiZSBmb2xsb3dlZFxuIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCQlpID0gajsKCX0KCglmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gTlVMTDsKCgluZXdpbmZvLT5lbnRyaWVzX3NpemUgPSByZXBsLT5lbnRyaWVzX3NpemU7CgluZXdpbmZvLT5uZW50cmllcyA9IHJlcGwtPm5lbnRyaWVzOwoKCS8qIGRvIHNvbWUgZWFybHkgY2hlY2tpbmdzIGFuZCBpbml0aWFsaXplIHNvbWUgdGhpbmdzICovCglpID0gMDsgLyogaG9sZHMgdGhlIGV4cGVjdGVkIG5yLiBvZiBlbnRyaWVzIGZvciB0aGUgY2hhaW4gKi8KCWogPSAwOyAvKiBob2xkcyB0aGUgdXAgdG8gbm93IGNvdW50ZWQgZW50cmllcyBmb3IgdGhlIGNoYWluICovCglrID0gMDsgLyogaG9sZHMgdGhlIHRvdGFsIG5yLiBvZiBlbnRyaWVzLCBzaG91bGQgZXF1YWwKCSAgICAgICAgICBuZXdpbmZvLT5uZW50cmllcyBhZnRlcndhcmRzICovCgl1ZGNfY250ID0gMDsgLyogd2lsbCBob2xkIHRoZSBuci4gb2YgdXNlciBkZWZpbmVkIGNoYWlucyAodWRjKSAqLwoJcmV0ID0gRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAoJICAgZWJ0X2NoZWNrX2VudHJ5X3NpemVfYW5kX2hvb2tzLCBuZXdpbmZvLCByZXBsLT5lbnRyaWVzLAoJICAgcmVwbC0+ZW50cmllcyArIHJlcGwtPmVudHJpZXNfc2l6ZSwgcmVwbC0+aG9va19lbnRyeSwgJmksICZqLCAmaywKCSAgICZ1ZGNfY250LCByZXBsLT52YWxpZF9ob29rcyk7CgoJaWYgKHJldCAhPSAwKQoJCXJldHVybiByZXQ7CgoJaWYgKGkgIT0gaikgewoJCUJVR1BSSU5UKCJuZW50cmllcyBkb2VzIG5vdCBlcXVhbCB0aGUgbnIgb2YgZW50cmllcyBpbiB0aGUgIgoJCSAgICAgICAgICIobGFzdCkgY2hhaW5cbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJaWYgKGsgIT0gbmV3aW5mby0+bmVudHJpZXMpIHsKCQlCVUdQUklOVCgiVG90YWwgbmVudHJpZXMgaXMgd3JvbmdcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qIGNoZWNrIGlmIGFsbCB2YWxpZCBob29rcyBoYXZlIGEgY2hhaW4gKi8KCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CgkJaWYgKG5ld2luZm8tPmhvb2tfZW50cnlbaV0gPT0gTlVMTCAmJgoJCSAgIChyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGkpKSkgewoJCQlCVUdQUklOVCgiVmFsaWQgaG9vayB3aXRob3V0IGNoYWluXG4iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJfQoKCS8qIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHVkYywgcHV0IHRoZW0gaW4gYW4gYXJyYXkKCSAgIHdoaWxlIHdlJ3JlIGF0IGl0LCBhbGxvY2F0ZSB0aGUgY2hhaW5zdGFjayAqLwoJaWYgKHVkY19jbnQpIHsKCQkvKiB0aGlzIHdpbGwgZ2V0IGZyZWUnZCBpbiBkb19yZXBsYWNlKCkvZWJ0X3JlZ2lzdGVyX3RhYmxlKCkKCQkgICBpZiBhbiBlcnJvciBvY2N1cnMgKi8KCQluZXdpbmZvLT5jaGFpbnN0YWNrID0KCQkJdm1hbGxvYygoaGlnaGVzdF9wb3NzaWJsZV9wcm9jZXNzb3JfaWQoKSsxKQoJCQkJICAgCSogc2l6ZW9mKCoobmV3aW5mby0+Y2hhaW5zdGFjaykpKTsKCQlpZiAoIW5ld2luZm8tPmNoYWluc3RhY2spCgkJCXJldHVybiAtRU5PTUVNOwoJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CgkJCW5ld2luZm8tPmNoYWluc3RhY2tbaV0gPQoJCQkgIHZtYWxsb2ModWRjX2NudCAqIHNpemVvZigqKG5ld2luZm8tPmNoYWluc3RhY2tbMF0pKSk7CgkJCWlmICghbmV3aW5mby0+Y2hhaW5zdGFja1tpXSkgewoJCQkJd2hpbGUgKGkpCgkJCQkJdmZyZWUobmV3aW5mby0+Y2hhaW5zdGFja1stLWldKTsKCQkJCXZmcmVlKG5ld2luZm8tPmNoYWluc3RhY2spOwoJCQkJbmV3aW5mby0+Y2hhaW5zdGFjayA9IE5VTEw7CgkJCQlyZXR1cm4gLUVOT01FTTsKCQkJfQoJCX0KCgkJY2xfcyA9IHZtYWxsb2ModWRjX2NudCAqIHNpemVvZigqY2xfcykpOwoJCWlmICghY2xfcykKCQkJcmV0dXJuIC1FTk9NRU07CgkJaSA9IDA7IC8qIHRoZSBpJ3RoIHVkYyAqLwoJCUVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKCQkgICBlYnRfZ2V0X3VkY19wb3NpdGlvbnMsIG5ld2luZm8sIHJlcGwtPmhvb2tfZW50cnksICZpLAoJCSAgIHJlcGwtPnZhbGlkX2hvb2tzLCBjbF9zKTsKCQkvKiBzYW5pdHkgY2hlY2sgKi8KCQlpZiAoaSAhPSB1ZGNfY250KSB7CgkJCUJVR1BSSU5UKCJpICE9IHVkY19jbnRcbiIpOwoJCQl2ZnJlZShjbF9zKTsKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJfQoJfQoKCS8qIENoZWNrIGZvciBsb29wcyAqLwoJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspCgkJaWYgKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaSkpCgkJCWlmIChjaGVja19jaGFpbmxvb3BzKG5ld2luZm8tPmhvb2tfZW50cnlbaV0sCgkJCSAgIGNsX3MsIHVkY19jbnQsIGksIG5ld2luZm8tPmVudHJpZXMpKSB7CgkJCQl2ZnJlZShjbF9zKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgoJLyogd2Ugbm93IGtub3cgdGhlIGZvbGxvd2luZyAoYWxvbmcgd2l0aCBFPW1jsik6CgkgICAtIHRoZSBuciBvZiBlbnRyaWVzIGluIGVhY2ggY2hhaW4gaXMgcmlnaHQKCSAgIC0gdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBzcGFjZSBpcyByaWdodAoJICAgLSBhbGwgdmFsaWQgaG9va3MgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgY2hhaW4KCSAgIC0gdGhlcmUgYXJlIG5vIGxvb3BzCgkgICAtIHdyb25nIGRhdGEgY2FuIHN0aWxsIGJlIG9uIHRoZSBsZXZlbCBvZiBhIHNpbmdsZSBlbnRyeQoJICAgLSBjb3VsZCBiZSB0aGVyZSBhcmUganVtcHMgdG8gcGxhY2VzIHRoYXQgYXJlIG5vdCB0aGUKCSAgICAgYmVnaW5uaW5nIG9mIGEgY2hhaW4uIFRoaXMgY2FuIG9ubHkgb2NjdXIgaW4gY2hhaW5zIHRoYXQKCSAgICAgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gYW55IGJhc2UgY2hhaW5zLCBzbyB3ZSBkb24ndCBjYXJlLiAqLwoKCS8qIHVzZWQgdG8ga25vdyB3aGF0IHdlIG5lZWQgdG8gY2xlYW4gdXAgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgKi8KCWkgPSAwOwoJcmV0ID0gRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAoJICAgZWJ0X2NoZWNrX2VudHJ5LCBuZXdpbmZvLCByZXBsLT5uYW1lLCAmaSwgcmVwbC0+dmFsaWRfaG9va3MsCgkgICBjbF9zLCB1ZGNfY250KTsKCWlmIChyZXQgIT0gMCkgewoJCUVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKCQkgICBlYnRfY2xlYW51cF9lbnRyeSwgJmkpOwoJfQoJdmZyZWUoY2xfcyk7CglyZXR1cm4gcmV0Owp9CgovKiBjYWxsZWQgdW5kZXIgd3JpdGVfbG9jayAqLwpzdGF0aWMgdm9pZCBnZXRfY291bnRlcnMoc3RydWN0IGVidF9jb3VudGVyICpvbGRjb3VudGVycywKICAgc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVycywgdW5zaWduZWQgaW50IG5lbnRyaWVzKQp7CglpbnQgaSwgY3B1OwoJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyX2Jhc2U7CgoJLyogY291bnRlcnMgb2YgY3B1IDAgKi8KCW1lbWNweShjb3VudGVycywgb2xkY291bnRlcnMsCgkgICAgICAgc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikgKiBuZW50cmllcyk7CgoJLyogYWRkIG90aGVyIGNvdW50ZXJzIHRvIHRob3NlIG9mIGNwdSAwICovCglmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CgkJaWYgKGNwdSA9PSAwKQoJCQljb250aW51ZTsKCQljb3VudGVyX2Jhc2UgPSBDT1VOVEVSX0JBU0Uob2xkY291bnRlcnMsIG5lbnRyaWVzLCBjcHUpOwoJCWZvciAoaSA9IDA7IGkgPCBuZW50cmllczsgaSsrKSB7CgkJCWNvdW50ZXJzW2ldLnBjbnQgKz0gY291bnRlcl9iYXNlW2ldLnBjbnQ7CgkJCWNvdW50ZXJzW2ldLmJjbnQgKz0gY291bnRlcl9iYXNlW2ldLmJjbnQ7CgkJfQoJfQp9CgovKiByZXBsYWNlIHRoZSB0YWJsZSAqLwpzdGF0aWMgaW50IGRvX3JlcGxhY2Uodm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCnsKCWludCByZXQsIGksIGNvdW50ZXJzaXplOwoJc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvOwoJc3RydWN0IGVidF9yZXBsYWNlIHRtcDsKCXN0cnVjdCBlYnRfdGFibGUgKnQ7CglzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzdG1wID0gTlVMTDsKCS8qIHVzZWQgdG8gYmUgYWJsZSB0byB1bmxvY2sgZWFybGllciAqLwoJc3RydWN0IGVidF90YWJsZV9pbmZvICp0YWJsZTsKCglpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCgkJcmV0dXJuIC1FRkFVTFQ7CgoJaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5lbnRyaWVzX3NpemUpIHsKCQlCVUdQUklOVCgiV3JvbmcgbGVuIGFyZ3VtZW50XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglpZiAodG1wLmVudHJpZXNfc2l6ZSA9PSAwKSB7CgkJQlVHUFJJTlQoIkVudHJpZXNfc2l6ZSBuZXZlciB6ZXJvXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCS8qIG92ZXJmbG93IGNoZWNrICovCglpZiAodG1wLm5lbnRyaWVzID49ICgoSU5UX01BWCAtIHNpemVvZihzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8pKSAvIE5SX0NQVVMgLQoJCQlTTVBfQ0FDSEVfQllURVMpIC8gc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpCgkJcmV0dXJuIC1FTk9NRU07CglpZiAodG1wLm51bV9jb3VudGVycyA+PSBJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpCgkJcmV0dXJuIC1FTk9NRU07CgoJY291bnRlcnNpemUgPSBDT1VOVEVSX09GRlNFVCh0bXAubmVudHJpZXMpICogCgkJCQkJKGhpZ2hlc3RfcG9zc2libGVfcHJvY2Vzc29yX2lkKCkrMSk7CgluZXdpbmZvID0gdm1hbGxvYyhzaXplb2YoKm5ld2luZm8pICsgY291bnRlcnNpemUpOwoJaWYgKCFuZXdpbmZvKQoJCXJldHVybiAtRU5PTUVNOwoKCWlmIChjb3VudGVyc2l6ZSkKCQltZW1zZXQobmV3aW5mby0+Y291bnRlcnMsIDAsIGNvdW50ZXJzaXplKTsKCgluZXdpbmZvLT5lbnRyaWVzID0gdm1hbGxvYyh0bXAuZW50cmllc19zaXplKTsKCWlmICghbmV3aW5mby0+ZW50cmllcykgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBmcmVlX25ld2luZm87Cgl9CglpZiAoY29weV9mcm9tX3VzZXIoCgkgICBuZXdpbmZvLT5lbnRyaWVzLCB0bXAuZW50cmllcywgdG1wLmVudHJpZXNfc2l6ZSkgIT0gMCkgewoJCUJVR1BSSU5UKCJDb3VsZG4ndCBjb3B5IGVudHJpZXMgZnJvbSB1c2Vyc3BhY2VcbiIpOwoJCXJldCA9IC1FRkFVTFQ7CgkJZ290byBmcmVlX2VudHJpZXM7Cgl9CgoJLyogdGhlIHVzZXIgd2FudHMgY291bnRlcnMgYmFjawoJICAgdGhlIGNoZWNrIG9uIHRoZSBzaXplIGlzIGRvbmUgbGF0ZXIsIHdoZW4gd2UgaGF2ZSB0aGUgbG9jayAqLwoJaWYgKHRtcC5udW1fY291bnRlcnMpIHsKCQljb3VudGVyc3RtcCA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZigqY291bnRlcnN0bXApKTsKCQlpZiAoIWNvdW50ZXJzdG1wKSB7CgkJCXJldCA9IC1FTk9NRU07CgkJCWdvdG8gZnJlZV9lbnRyaWVzOwoJCX0KCX0KCWVsc2UKCQljb3VudGVyc3RtcCA9IE5VTEw7CgoJLyogdGhpcyBjYW4gZ2V0IGluaXRpYWxpemVkIGJ5IHRyYW5zbGF0ZV90YWJsZSgpICovCgluZXdpbmZvLT5jaGFpbnN0YWNrID0gTlVMTDsKCXJldCA9IHRyYW5zbGF0ZV90YWJsZSgmdG1wLCBuZXdpbmZvKTsKCglpZiAocmV0ICE9IDApCgkJZ290byBmcmVlX2NvdW50ZXJzdG1wOwoKCXQgPSBmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOwoJaWYgKCF0KSB7CgkJcmV0ID0gLUVOT0VOVDsKCQlnb3RvIGZyZWVfaXRlcmF0ZTsKCX0KCgkvKiB0aGUgdGFibGUgZG9lc24ndCBsaWtlIGl0ICovCglpZiAodC0+Y2hlY2sgJiYgKHJldCA9IHQtPmNoZWNrKG5ld2luZm8sIHRtcC52YWxpZF9ob29rcykpKQoJCWdvdG8gZnJlZV91bmxvY2s7CgoJaWYgKHRtcC5udW1fY291bnRlcnMgJiYgdG1wLm51bV9jb3VudGVycyAhPSB0LT5wcml2YXRlLT5uZW50cmllcykgewoJCUJVR1BSSU5UKCJXcm9uZyBuci4gb2YgY291bnRlcnMgcmVxdWVzdGVkXG4iKTsKCQlyZXQgPSAtRUlOVkFMOwoJCWdvdG8gZnJlZV91bmxvY2s7Cgl9CgoJLyogd2UgaGF2ZSB0aGUgbXV0ZXggbG9jaywgc28gbm8gZGFuZ2VyIGluIHJlYWRpbmcgdGhpcyBwb2ludGVyICovCgl0YWJsZSA9IHQtPnByaXZhdGU7CgkvKiBtYWtlIHN1cmUgdGhlIHRhYmxlIGNhbiBvbmx5IGJlIHJtbW9kJ2VkIGlmIGl0IGNvbnRhaW5zIG5vIHJ1bGVzICovCglpZiAoIXRhYmxlLT5uZW50cmllcyAmJiBuZXdpbmZvLT5uZW50cmllcyAmJiAhdHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7CgkJcmV0ID0gLUVOT0VOVDsKCQlnb3RvIGZyZWVfdW5sb2NrOwoJfSBlbHNlIGlmICh0YWJsZS0+bmVudHJpZXMgJiYgIW5ld2luZm8tPm5lbnRyaWVzKQoJCW1vZHVsZV9wdXQodC0+bWUpOwoJLyogd2UgbmVlZCBhbiBhdG9taWMgc25hcHNob3Qgb2YgdGhlIGNvdW50ZXJzICovCgl3cml0ZV9sb2NrX2JoKCZ0LT5sb2NrKTsKCWlmICh0bXAubnVtX2NvdW50ZXJzKQoJCWdldF9jb3VudGVycyh0LT5wcml2YXRlLT5jb3VudGVycywgY291bnRlcnN0bXAsCgkJICAgdC0+cHJpdmF0ZS0+bmVudHJpZXMpOwoKCXQtPnByaXZhdGUgPSBuZXdpbmZvOwoJd3JpdGVfdW5sb2NrX2JoKCZ0LT5sb2NrKTsKCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCS8qIHNvLCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgY2hhaW5zIHdoaWxlIGhhdmluZyBtZXNzZWQgdXAgaGVyIGNvdW50ZXIKCSAgIGFsbG9jYXRpb24uIE9ubHkgcmVhc29uIHdoeSB0aGlzIGlzIGRvbmUgaXMgYmVjYXVzZSB0aGlzIHdheSB0aGUgbG9jawoJICAgaXMgaGVsZCBvbmx5IG9uY2UsIHdoaWxlIHRoaXMgZG9lc24ndCBicmluZyB0aGUga2VybmVsIGludG8gYQoJICAgZGFuZ2Vyb3VzIHN0YXRlLiAqLwoJaWYgKHRtcC5udW1fY291bnRlcnMgJiYKCSAgIGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzdG1wLAoJICAgdG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKSkgewoJCUJVR1BSSU5UKCJDb3VsZG4ndCBjb3B5IGNvdW50ZXJzIHRvIHVzZXJzcGFjZVxuIik7CgkJcmV0ID0gLUVGQVVMVDsKCX0KCWVsc2UKCQlyZXQgPSAwOwoKCS8qIGRlY3JlYXNlIG1vZHVsZSBjb3VudCBhbmQgZnJlZSByZXNvdXJjZXMgKi8KCUVCVF9FTlRSWV9JVEVSQVRFKHRhYmxlLT5lbnRyaWVzLCB0YWJsZS0+ZW50cmllc19zaXplLAoJICAgZWJ0X2NsZWFudXBfZW50cnksIE5VTEwpOwoKCXZmcmVlKHRhYmxlLT5lbnRyaWVzKTsKCWlmICh0YWJsZS0+Y2hhaW5zdGFjaykgewoJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQoJCQl2ZnJlZSh0YWJsZS0+Y2hhaW5zdGFja1tpXSk7CgkJdmZyZWUodGFibGUtPmNoYWluc3RhY2spOwoJfQoJdmZyZWUodGFibGUpOwoKCXZmcmVlKGNvdW50ZXJzdG1wKTsKCXJldHVybiByZXQ7CgpmcmVlX3VubG9jazoKCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKZnJlZV9pdGVyYXRlOgoJRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAoJICAgZWJ0X2NsZWFudXBfZW50cnksIE5VTEwpOwpmcmVlX2NvdW50ZXJzdG1wOgoJdmZyZWUoY291bnRlcnN0bXApOwoJLyogY2FuIGJlIGluaXRpYWxpemVkIGluIHRyYW5zbGF0ZV90YWJsZSgpICovCglpZiAobmV3aW5mby0+Y2hhaW5zdGFjaykgewoJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQoJCQl2ZnJlZShuZXdpbmZvLT5jaGFpbnN0YWNrW2ldKTsKCQl2ZnJlZShuZXdpbmZvLT5jaGFpbnN0YWNrKTsKCX0KZnJlZV9lbnRyaWVzOgoJdmZyZWUobmV3aW5mby0+ZW50cmllcyk7CmZyZWVfbmV3aW5mbzoKCXZmcmVlKG5ld2luZm8pOwoJcmV0dXJuIHJldDsKfQoKaW50IGVidF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGVidF90YXJnZXQgKnRhcmdldCkKewoJaW50IHJldDsKCglyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVidF9tdXRleCk7CglpZiAocmV0ICE9IDApCgkJcmV0dXJuIHJldDsKCWlmICghbGlzdF9uYW1lZF9pbnNlcnQoJmVidF90YXJnZXRzLCB0YXJnZXQpKSB7CgkJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwoJCXJldHVybiAtRUVYSVNUOwoJfQoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwoKCXJldHVybiAwOwp9Cgp2b2lkIGVidF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgZWJ0X3RhcmdldCAqdGFyZ2V0KQp7CgltdXRleF9sb2NrKCZlYnRfbXV0ZXgpOwoJTElTVF9ERUxFVEUoJmVidF90YXJnZXRzLCB0YXJnZXQpOwoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwp9CgppbnQgZWJ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBlYnRfbWF0Y2ggKm1hdGNoKQp7CglpbnQgcmV0OwoKCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWJ0X211dGV4KTsKCWlmIChyZXQgIT0gMCkKCQlyZXR1cm4gcmV0OwoJaWYgKCFsaXN0X25hbWVkX2luc2VydCgmZWJ0X21hdGNoZXMsIG1hdGNoKSkgewoJCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCQlyZXR1cm4gLUVFWElTVDsKCX0KCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCglyZXR1cm4gMDsKfQoKdm9pZCBlYnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaCkKewoJbXV0ZXhfbG9jaygmZWJ0X211dGV4KTsKCUxJU1RfREVMRVRFKCZlYnRfbWF0Y2hlcywgbWF0Y2gpOwoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwp9CgppbnQgZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoc3RydWN0IGVidF93YXRjaGVyICp3YXRjaGVyKQp7CglpbnQgcmV0OwoKCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWJ0X211dGV4KTsKCWlmIChyZXQgIT0gMCkKCQlyZXR1cm4gcmV0OwoJaWYgKCFsaXN0X25hbWVkX2luc2VydCgmZWJ0X3dhdGNoZXJzLCB3YXRjaGVyKSkgewoJCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCQlyZXR1cm4gLUVFWElTVDsKCX0KCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCglyZXR1cm4gMDsKfQoKdm9pZCBlYnRfdW5yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcikKewoJbXV0ZXhfbG9jaygmZWJ0X211dGV4KTsKCUxJU1RfREVMRVRFKCZlYnRfd2F0Y2hlcnMsIHdhdGNoZXIpOwoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwp9CgppbnQgZWJ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBlYnRfdGFibGUgKnRhYmxlKQp7CglzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm87CglpbnQgcmV0LCBpLCBjb3VudGVyc2l6ZTsKCglpZiAoIXRhYmxlIHx8ICF0YWJsZS0+dGFibGUgfHwhdGFibGUtPnRhYmxlLT5lbnRyaWVzIHx8CgkgICAgdGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUgPT0gMCB8fAoJICAgIHRhYmxlLT50YWJsZS0+Y291bnRlcnMgfHwgdGFibGUtPnByaXZhdGUpIHsKCQlCVUdQUklOVCgiQmFkIHRhYmxlIGRhdGEgZm9yIGVidF9yZWdpc3Rlcl90YWJsZSEhIVxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJY291bnRlcnNpemUgPSBDT1VOVEVSX09GRlNFVCh0YWJsZS0+dGFibGUtPm5lbnRyaWVzKSAqCgkJCQkJKGhpZ2hlc3RfcG9zc2libGVfcHJvY2Vzc29yX2lkKCkrMSk7CgluZXdpbmZvID0gdm1hbGxvYyhzaXplb2YoKm5ld2luZm8pICsgY291bnRlcnNpemUpOwoJcmV0ID0gLUVOT01FTTsKCWlmICghbmV3aW5mbykKCQlyZXR1cm4gLUVOT01FTTsKCgluZXdpbmZvLT5lbnRyaWVzID0gdm1hbGxvYyh0YWJsZS0+dGFibGUtPmVudHJpZXNfc2l6ZSk7CglpZiAoIShuZXdpbmZvLT5lbnRyaWVzKSkKCQlnb3RvIGZyZWVfbmV3aW5mbzsKCgltZW1jcHkobmV3aW5mby0+ZW50cmllcywgdGFibGUtPnRhYmxlLT5lbnRyaWVzLAoJICAgdGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOwoKCWlmIChjb3VudGVyc2l6ZSkKCQltZW1zZXQobmV3aW5mby0+Y291bnRlcnMsIDAsIGNvdW50ZXJzaXplKTsKCgkvKiBmaWxsIGluIG5ld2luZm8gYW5kIHBhcnNlIHRoZSBlbnRyaWVzICovCgluZXdpbmZvLT5jaGFpbnN0YWNrID0gTlVMTDsKCXJldCA9IHRyYW5zbGF0ZV90YWJsZSh0YWJsZS0+dGFibGUsIG5ld2luZm8pOwoJaWYgKHJldCAhPSAwKSB7CgkJQlVHUFJJTlQoIlRyYW5zbGF0ZV90YWJsZSBmYWlsZWRcbiIpOwoJCWdvdG8gZnJlZV9jaGFpbnN0YWNrOwoJfQoKCWlmICh0YWJsZS0+Y2hlY2sgJiYgdGFibGUtPmNoZWNrKG5ld2luZm8sIHRhYmxlLT52YWxpZF9ob29rcykpIHsKCQlCVUdQUklOVCgiVGhlIHRhYmxlIGRvZXNuJ3QgbGlrZSBpdHMgb3duIGluaXRpYWwgZGF0YSwgbG9sXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87Cglyd2xvY2tfaW5pdCgmdGFibGUtPmxvY2spOwoJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlYnRfbXV0ZXgpOwoJaWYgKHJldCAhPSAwKQoJCWdvdG8gZnJlZV9jaGFpbnN0YWNrOwoKCWlmIChsaXN0X25hbWVkX2ZpbmQoJmVidF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgewoJCXJldCA9IC1FRVhJU1Q7CgkJQlVHUFJJTlQoIlRhYmxlIG5hbWUgYWxyZWFkeSBleGlzdHNcbiIpOwoJCWdvdG8gZnJlZV91bmxvY2s7Cgl9CgoJLyogSG9sZCBhIHJlZmVyZW5jZSBjb3VudCBpZiB0aGUgY2hhaW5zIGFyZW4ndCBlbXB0eSAqLwoJaWYgKG5ld2luZm8tPm5lbnRyaWVzICYmICF0cnlfbW9kdWxlX2dldCh0YWJsZS0+bWUpKSB7CgkJcmV0ID0gLUVOT0VOVDsKCQlnb3RvIGZyZWVfdW5sb2NrOwoJfQoJbGlzdF9wcmVwZW5kKCZlYnRfdGFibGVzLCB0YWJsZSk7CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7CglyZXR1cm4gMDsKZnJlZV91bmxvY2s6CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7CmZyZWVfY2hhaW5zdGFjazoKCWlmIChuZXdpbmZvLT5jaGFpbnN0YWNrKSB7CgkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCgkJCXZmcmVlKG5ld2luZm8tPmNoYWluc3RhY2tbaV0pOwoJCXZmcmVlKG5ld2luZm8tPmNoYWluc3RhY2spOwoJfQoJdmZyZWUobmV3aW5mby0+ZW50cmllcyk7CmZyZWVfbmV3aW5mbzoKCXZmcmVlKG5ld2luZm8pOwoJcmV0dXJuIHJldDsKfQoKdm9pZCBlYnRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgZWJ0X3RhYmxlICp0YWJsZSkKewoJaW50IGk7CgoJaWYgKCF0YWJsZSkgewoJCUJVR1BSSU5UKCJSZXF1ZXN0IHRvIHVucmVnaXN0ZXIgTlVMTCB0YWJsZSEhIVxuIik7CgkJcmV0dXJuOwoJfQoJbXV0ZXhfbG9jaygmZWJ0X211dGV4KTsKCUxJU1RfREVMRVRFKCZlYnRfdGFibGVzLCB0YWJsZSk7CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7Cgl2ZnJlZSh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcyk7CglpZiAodGFibGUtPnByaXZhdGUtPmNoYWluc3RhY2spIHsKCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKCQkJdmZyZWUodGFibGUtPnByaXZhdGUtPmNoYWluc3RhY2tbaV0pOwoJCXZmcmVlKHRhYmxlLT5wcml2YXRlLT5jaGFpbnN0YWNrKTsKCX0KCXZmcmVlKHRhYmxlLT5wcml2YXRlKTsKfQoKLyogdXNlcnNwYWNlIGp1c3Qgc3VwcGxpZWQgdXMgd2l0aCBjb3VudGVycyAqLwpzdGF0aWMgaW50IHVwZGF0ZV9jb3VudGVycyh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKewoJaW50IGksIHJldDsKCXN0cnVjdCBlYnRfY291bnRlciAqdG1wOwoJc3RydWN0IGVidF9yZXBsYWNlIGhscDsKCXN0cnVjdCBlYnRfdGFibGUgKnQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZobHAsIHVzZXIsIHNpemVvZihobHApKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAobGVuICE9IHNpemVvZihobHApICsgaGxwLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKGhscC5udW1fY291bnRlcnMgPT0gMCkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoISh0bXAgPSB2bWFsbG9jKGhscC5udW1fY291bnRlcnMgKiBzaXplb2YoKnRtcCkpKSkgewoJCU1FTVBSSU5UKCJVcGRhdGVfY291bnRlcnMgJiYgbm9tZW1vcnlcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXQgPSBmaW5kX3RhYmxlX2xvY2soaGxwLm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOwoJaWYgKCF0KQoJCWdvdG8gZnJlZV90bXA7CgoJaWYgKGhscC5udW1fY291bnRlcnMgIT0gdC0+cHJpdmF0ZS0+bmVudHJpZXMpIHsKCQlCVUdQUklOVCgiV3JvbmcgbnIgb2YgY291bnRlcnNcbiIpOwoJCXJldCA9IC1FSU5WQUw7CgkJZ290byB1bmxvY2tfbXV0ZXg7Cgl9CgoJaWYgKCBjb3B5X2Zyb21fdXNlcih0bXAsIGhscC5jb3VudGVycywKCSAgIGhscC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSkgKSB7CgkJQlVHUFJJTlQoIlVwZGF0YV9jb3VudGVycyAmJiAhY2Z1XG4iKTsKCQlyZXQgPSAtRUZBVUxUOwoJCWdvdG8gdW5sb2NrX211dGV4OwoJfQoKCS8qIHdlIHdhbnQgYW4gYXRvbWljIGFkZCBvZiB0aGUgY291bnRlcnMgKi8KCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOwoKCS8qIHdlIGFkZCB0byB0aGUgY291bnRlcnMgb2YgdGhlIGZpcnN0IGNwdSAqLwoJZm9yIChpID0gMDsgaSA8IGhscC5udW1fY291bnRlcnM7IGkrKykgewoJCXQtPnByaXZhdGUtPmNvdW50ZXJzW2ldLnBjbnQgKz0gdG1wW2ldLnBjbnQ7CgkJdC0+cHJpdmF0ZS0+Y291bnRlcnNbaV0uYmNudCArPSB0bXBbaV0uYmNudDsKCX0KCgl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwoJcmV0ID0gMDsKdW5sb2NrX211dGV4OgoJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwpmcmVlX3RtcDoKCXZmcmVlKHRtcCk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV9tYXRjaG5hbWUoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbSwKICAgY2hhciAqYmFzZSwgY2hhciAqdWJhc2UpCnsKCWNoYXIgKmhscCA9IHViYXNlIC0gYmFzZSArIChjaGFyICopbTsKCWlmIChjb3B5X3RvX3VzZXIoaGxwLCBtLT51Lm1hdGNoLT5uYW1lLCBFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTikpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQgZWJ0X21ha2Vfd2F0Y2hlcm5hbWUoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LAogICBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKewoJY2hhciAqaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKil3OwoJaWYgKGNvcHlfdG9fdXNlcihobHAgLCB3LT51LndhdGNoZXItPm5hbWUsIEVCVF9GVU5DVElPTl9NQVhOQU1FTEVOKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV9uYW1lcyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKewoJaW50IHJldDsKCWNoYXIgKmhscDsKCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OwoKCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSA9PSAwKQoJCXJldHVybiAwOwoKCWhscCA9IHViYXNlIC0gYmFzZSArIChjaGFyICopZSArIGUtPnRhcmdldF9vZmZzZXQ7Cgl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CgkKCXJldCA9IEVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9tYWtlX21hdGNobmFtZSwgYmFzZSwgdWJhc2UpOwoJaWYgKHJldCAhPSAwKQoJCXJldHVybiByZXQ7CglyZXQgPSBFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGVidF9tYWtlX3dhdGNoZXJuYW1lLCBiYXNlLCB1YmFzZSk7CglpZiAocmV0ICE9IDApCgkJcmV0dXJuIHJldDsKCWlmIChjb3B5X3RvX3VzZXIoaGxwLCB0LT51LnRhcmdldC0+bmFtZSwgRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU4pKQoJCXJldHVybiAtRUZBVUxUOwoJcmV0dXJuIDA7Cn0KCi8qIGNhbGxlZCB3aXRoIGVidF9tdXRleCBsb2NrZWQgKi8Kc3RhdGljIGludCBjb3B5X2V2ZXJ5dGhpbmdfdG9fdXNlcihzdHJ1Y3QgZWJ0X3RhYmxlICp0LCB2b2lkIF9fdXNlciAqdXNlciwKICAgaW50ICpsZW4sIGludCBjbWQpCnsKCXN0cnVjdCBlYnRfcmVwbGFjZSB0bXA7CglzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzdG1wLCAqb2xkY291bnRlcnM7Cgl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplLCBuZW50cmllczsKCWNoYXIgKmVudHJpZXM7CgoJaWYgKGNtZCA9PSBFQlRfU09fR0VUX0VOVFJJRVMpIHsKCQllbnRyaWVzX3NpemUgPSB0LT5wcml2YXRlLT5lbnRyaWVzX3NpemU7CgkJbmVudHJpZXMgPSB0LT5wcml2YXRlLT5uZW50cmllczsKCQllbnRyaWVzID0gdC0+cHJpdmF0ZS0+ZW50cmllczsKCQlvbGRjb3VudGVycyA9IHQtPnByaXZhdGUtPmNvdW50ZXJzOwoJfSBlbHNlIHsKCQllbnRyaWVzX3NpemUgPSB0LT50YWJsZS0+ZW50cmllc19zaXplOwoJCW5lbnRyaWVzID0gdC0+dGFibGUtPm5lbnRyaWVzOwoJCWVudHJpZXMgPSB0LT50YWJsZS0+ZW50cmllczsKCQlvbGRjb3VudGVycyA9IHQtPnRhYmxlLT5jb3VudGVyczsKCX0KCglpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpKSB7CgkJQlVHUFJJTlQoIkNmdSBkaWRuJ3Qgd29ya1xuIik7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJaWYgKCpsZW4gIT0gc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSkgKyBlbnRyaWVzX3NpemUgKwoJICAgKHRtcC5udW1fY291bnRlcnM/IG5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcik6IDApKSB7CgkJQlVHUFJJTlQoIldyb25nIHNpemVcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWlmICh0bXAubmVudHJpZXMgIT0gbmVudHJpZXMpIHsKCQlCVUdQUklOVCgiTmVudHJpZXMgd3JvbmdcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWlmICh0bXAuZW50cmllc19zaXplICE9IGVudHJpZXNfc2l6ZSkgewoJCUJVR1BSSU5UKCJXcm9uZyBzaXplXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiB1c2Vyc3BhY2UgbWlnaHQgbm90IG5lZWQgdGhlIGNvdW50ZXJzICovCglpZiAodG1wLm51bV9jb3VudGVycykgewoJCWlmICh0bXAubnVtX2NvdW50ZXJzICE9IG5lbnRyaWVzKSB7CgkJCUJVR1BSSU5UKCJOdW1fY291bnRlcnMgd3JvbmdcbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJY291bnRlcnN0bXAgPSB2bWFsbG9jKG5lbnRyaWVzICogc2l6ZW9mKCpjb3VudGVyc3RtcCkpOwoJCWlmICghY291bnRlcnN0bXApIHsKCQkJTUVNUFJJTlQoIkNvdWxkbid0IGNvcHkgY291bnRlcnMsIG91dCBvZiBtZW1vcnlcbiIpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgkJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7CgkJZ2V0X2NvdW50ZXJzKG9sZGNvdW50ZXJzLCBjb3VudGVyc3RtcCwgbmVudHJpZXMpOwoJCXdyaXRlX3VubG9ja19iaCgmdC0+bG9jayk7CgoJCWlmIChjb3B5X3RvX3VzZXIodG1wLmNvdW50ZXJzLCBjb3VudGVyc3RtcCwKCQkgICBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKSkgewoJCQlCVUdQUklOVCgiQ291bGRuJ3QgY29weSBjb3VudGVycyB0byB1c2Vyc3BhY2VcbiIpOwoJCQl2ZnJlZShjb3VudGVyc3RtcCk7CgkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQl2ZnJlZShjb3VudGVyc3RtcCk7Cgl9CgoJaWYgKGNvcHlfdG9fdXNlcih0bXAuZW50cmllcywgZW50cmllcywgZW50cmllc19zaXplKSkgewoJCUJVR1BSSU5UKCJDb3VsZG4ndCBjb3B5IGVudHJpZXMgdG8gdXNlcnNwYWNlXG4iKTsKCQlyZXR1cm4gLUVGQVVMVDsKCX0KCS8qIHNldCB0aGUgbWF0Y2gvd2F0Y2hlci90YXJnZXQgbmFtZXMgcmlnaHQgKi8KCXJldHVybiBFQlRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBlbnRyaWVzX3NpemUsCgkgICBlYnRfbWFrZV9uYW1lcywgZW50cmllcywgdG1wLmVudHJpZXMpOwp9CgpzdGF0aWMgaW50IGRvX2VidF9zZXRfY3RsKHN0cnVjdCBzb2NrICpzaywKCWludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQp7CglpbnQgcmV0OwoKCXN3aXRjaChjbWQpIHsKCWNhc2UgRUJUX1NPX1NFVF9FTlRSSUVTOgoJCXJldCA9IGRvX3JlcGxhY2UodXNlciwgbGVuKTsKCQlicmVhazsKCWNhc2UgRUJUX1NPX1NFVF9DT1VOVEVSUzoKCQlyZXQgPSB1cGRhdGVfY291bnRlcnModXNlciwgbGVuKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0ID0gLUVJTlZBTDsKICB9CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGRvX2VidF9nZXRfY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIGludCAqbGVuKQp7CglpbnQgcmV0OwoJc3RydWN0IGVidF9yZXBsYWNlIHRtcDsKCXN0cnVjdCBlYnRfdGFibGUgKnQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSkKCQlyZXR1cm4gLUVGQVVMVDsKCgl0ID0gZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lLCAmcmV0LCAmZWJ0X211dGV4KTsKCWlmICghdCkKCQlyZXR1cm4gcmV0OwoKCXN3aXRjaChjbWQpIHsKCWNhc2UgRUJUX1NPX0dFVF9JTkZPOgoJY2FzZSBFQlRfU09fR0VUX0lOSVRfSU5GTzoKCQlpZiAoKmxlbiAhPSBzaXplb2Yoc3RydWN0IGVidF9yZXBsYWNlKSl7CgkJCXJldCA9IC1FSU5WQUw7CgkJCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCQkJYnJlYWs7CgkJfQoJCWlmIChjbWQgPT0gRUJUX1NPX0dFVF9JTkZPKSB7CgkJCXRtcC5uZW50cmllcyA9IHQtPnByaXZhdGUtPm5lbnRyaWVzOwoJCQl0bXAuZW50cmllc19zaXplID0gdC0+cHJpdmF0ZS0+ZW50cmllc19zaXplOwoJCQl0bXAudmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKCQl9IGVsc2UgewoJCQl0bXAubmVudHJpZXMgPSB0LT50YWJsZS0+bmVudHJpZXM7CgkJCXRtcC5lbnRyaWVzX3NpemUgPSB0LT50YWJsZS0+ZW50cmllc19zaXplOwoJCQl0bXAudmFsaWRfaG9va3MgPSB0LT50YWJsZS0+dmFsaWRfaG9va3M7CgkJfQoJCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKCQlpZiAoY29weV90b191c2VyKHVzZXIsICZ0bXAsICpsZW4pICE9IDApewoJCQlCVUdQUklOVCgiYzJ1IERpZG4ndCB3b3JrXG4iKTsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCXJldCA9IDA7CgkJYnJlYWs7CgoJY2FzZSBFQlRfU09fR0VUX0VOVFJJRVM6CgljYXNlIEVCVF9TT19HRVRfSU5JVF9FTlRSSUVTOgoJCXJldCA9IGNvcHlfZXZlcnl0aGluZ190b191c2VyKHQsIHVzZXIsIGxlbiwgY21kKTsKCQltdXRleF91bmxvY2soJmVidF9tdXRleCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQltdXRleF91bmxvY2soJmVidF9tdXRleCk7CgkJcmV0ID0gLUVJTlZBTDsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IG5mX3NvY2tvcHRfb3BzIGVidF9zb2Nrb3B0cyA9CnsKCS5wZgkJPSBQRl9JTkVULAoJLnNldF9vcHRtaW4JPSBFQlRfQkFTRV9DVEwsCgkuc2V0X29wdG1heAk9IEVCVF9TT19TRVRfTUFYICsgMSwKCS5zZXQJCT0gZG9fZWJ0X3NldF9jdGwsCgkuZ2V0X29wdG1pbgk9IEVCVF9CQVNFX0NUTCwKCS5nZXRfb3B0bWF4CT0gRUJUX1NPX0dFVF9NQVggKyAxLAoJLmdldAkJPSBkb19lYnRfZ2V0X2N0bCwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGVidGFibGVzX2luaXQodm9pZCkKewoJaW50IHJldDsKCgltdXRleF9sb2NrKCZlYnRfbXV0ZXgpOwoJbGlzdF9uYW1lZF9pbnNlcnQoJmVidF90YXJnZXRzLCAmZWJ0X3N0YW5kYXJkX3RhcmdldCk7CgltdXRleF91bmxvY2soJmVidF9tdXRleCk7CglpZiAoKHJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmVidF9zb2Nrb3B0cykpIDwgMCkKCQlyZXR1cm4gcmV0OwoKCXByaW50ayhLRVJOX05PVElDRSAiRWJ0YWJsZXMgdjIuMCByZWdpc3RlcmVkXG4iKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZWJ0YWJsZXNfZmluaSh2b2lkKQp7CgluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmVidF9zb2Nrb3B0cyk7CglwcmludGsoS0VSTl9OT1RJQ0UgIkVidGFibGVzIHYyLjAgdW5yZWdpc3RlcmVkXG4iKTsKfQoKRVhQT1JUX1NZTUJPTChlYnRfcmVnaXN0ZXJfdGFibGUpOwpFWFBPUlRfU1lNQk9MKGVidF91bnJlZ2lzdGVyX3RhYmxlKTsKRVhQT1JUX1NZTUJPTChlYnRfcmVnaXN0ZXJfbWF0Y2gpOwpFWFBPUlRfU1lNQk9MKGVidF91bnJlZ2lzdGVyX21hdGNoKTsKRVhQT1JUX1NZTUJPTChlYnRfcmVnaXN0ZXJfd2F0Y2hlcik7CkVYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcik7CkVYUE9SVF9TWU1CT0woZWJ0X3JlZ2lzdGVyX3RhcmdldCk7CkVYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfdGFyZ2V0KTsKRVhQT1JUX1NZTUJPTChlYnRfZG9fdGFibGUpOwptb2R1bGVfaW5pdChlYnRhYmxlc19pbml0KTsKbW9kdWxlX2V4aXQoZWJ0YWJsZXNfZmluaSk7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK