ZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvZmF0LmMgYi9mcy9mZG9zL2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGY3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mZG9zL2ZhdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTdOR1YmxpIEZhdmVyZ2VzIC0gPHd3dy5zdGF1YmxpLmNvbT4KKyAqIFBpZXJyZSBBVUJFUlQgIHAuYXViZXJ0QHN0YXVibGkuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKworI2luY2x1ZGUgImRvcy5oIgorI2luY2x1ZGUgImZkb3MuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYXRfZGVjb2RlIC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit1bnNpZ25lZCBpbnQgZmF0X2RlY29kZSAoRnNfdCAqZnMsIHVuc2lnbmVkIGludCBudW0pCit7CisgICAgdW5zaWduZWQgaW50IHN0YXJ0ID0gbnVtICogMyAvIDI7CisgICAgdW5zaWduZWQgY2hhciAqYWRkcmVzcyA9IGZzIC0+IGZhdF9idWYgKyBzdGFydDsKKyAgICAKKyAgICBpZiAobnVtIDwgMiB8fCBzdGFydCArIDEgPiAoZnMgLT4gZmF0X2xlbiAqIFNaX1NURF9TRUNUT1IpKQorICAgICAgICByZXR1cm4gMTsKKyAgICAKKyAgICBpZiAobnVtICYgMSkKKyAgICAgICAgcmV0dXJuICgoYWRkcmVzcyBbMV0gJiAweGZmKSA8PCA0KSB8ICgoYWRkcmVzcyBbMF0gJiAweGYwICkgPj4gNCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChhZGRyZXNzIFsxXSAmIDB4ZikgPDwgOCkgfCAoYWRkcmVzcyBbMF0gJiAweGZmICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjaGVja19mYXQgLS0gCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZmF0IChGc190ICpmcykKK3sKKyAgICBpbnQgaSwgZjsKKworICAgIC8qIENsdXN0ZXIgdmVyaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZvciAoaSA9IDMgOyBpIDwgZnMgLT4gbnVtX2NsdXM7IGkrKyl7CisgICAgICAgIGYgPSBmYXRfZGVjb2RlIChmcywgaSk7CisgICAgICAgIGlmIChmIDwgRkFUMTJfTEFTVCAmJiBmID4gZnMgLT4gbnVtX2NsdXMpeworICAgICAgICAgICAgLyogV3JvbmcgY2x1c3RlciBudW1iZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWRfb25lX2ZhdCAtLSAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCByZWFkX29uZV9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMsIGludCBuZmF0KQoreworICAgIGlmIChkZXZfcmVhZCAoZnMgLT4gZmF0X2J1ZiwKKyAgICAgICAgICAgICAgICAgIChmcyAtPiBmYXRfc3RhcnQgKyBuZmF0ICogZnMgLT4gZmF0X2xlbiksCisgICAgICAgICAgICAgICAgICBmcyAtPiBmYXRfbGVuKSA8IDApIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgaWYgKGZzIC0+IGZhdF9idWYgWzBdIHx8IGZzIC0+IGZhdF9idWYgWzFdIHx8IGZzIC0+IGZhdF9idWYgWzJdKSB7CisgICAgICAgIGlmICgoZnMgLT4gZmF0X2J1ZiBbMF0gIT0gYm9vdCAtPiBkZXNjciAmJgorICAgICAgICAgICAgIChmcyAtPiBmYXRfYnVmIFswXSAhPSAweGY5IHx8IGJvb3QgLT4gZGVzY3IgIT0gTUVESUFfU1REKSkgfHwKKyAgICAgICAgICAgIGZzIC0+IGZhdF9idWYgWzBdIDwgTUVESUFfU1REKXsKKyAgICAgICAgICAgIC8qIFVua25vd24gTWVkaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIGlmIChmcyAtPiBmYXRfYnVmIFsxXSAhPSAweGZmIHx8IGZzIC0+IGZhdF9idWYgWzJdICE9IDB4ZmYpeworICAgICAgICAgICAgLyogRkFUIGRvZXNuJ3Qgc3RhcnQgd2l0aCBnb29kIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnMgLT4gbnVtX2NsdXMgPj0gRkFUMTJfTUFYX05CKSB7CisgICAgICAgIC8qIFRvbyBtdWNoIGNsdXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIHJldHVybiBjaGVja19mYXQgKGZzKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWRfZmF0IC0tIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgcmVhZF9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpCit7CisgICAgdW5zaWduZWQgaW50IGJ1ZmxlbjsKKyAgICBpbnQgaTsKKworICAgIC8qIEFsbG9jYXRlIEZhdCBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGJ1ZmxlbiA9IGZzIC0+IGZhdF9sZW4gKiBTWl9TVERfU0VDVE9SOworICAgIGlmIChmcyAtPiBmYXRfYnVmKSB7CisgICAgICAgIGZyZWUgKGZzIC0+IGZhdF9idWYpOworICAgIH0KKworICAgIGlmICgoZnMgLT4gZmF0X2J1ZiA9IG1hbGxvYyAoYnVmbGVuKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gcmVhZCBlYWNoIEZhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpPCBmcyAtPiBuYl9mYXQ7IGkrKyl7CisgICAgICAgIGlmIChyZWFkX29uZV9mYXQgKGJvb3QsIGZzLCBpKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBGYXQgaXMgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBmcyAtPiBudW1fZmF0ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gZnMgLT4gbmJfZmF0KXsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIAorICAgIGlmIChmcyAtPiBmYXRfbGVuID4gKCgoZnMgLT4gbnVtX2NsdXMgKyAyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVRfQklUUyAvIDQpIC0xICkgLyAyIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBTWl9TVERfU0VDVE9SICsgMSkpIHsKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKworIAorCisjZW5kaWYK